我知道这可能是一个非常基本的问题,但我只是在学习而且被卡住了。我无法解决如何做我需要做的事情。
我有一个名为RallyResults的数组
rallyResults [ { ExecutionType: 'ci',
dataArray:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object] ] },
{ ExecutionType: 'regression',
dataArray: [ [Object], [Object], [Object], [Object], [Object], [Object] ] },
{ ExecutionType: 'ci',
dataArray: [ [Object], [Object], [Object], [Object], [Object], [Object] ] }
{ ExecutionType: 'regression',
dataArray: [ [Object], [Object], [Object], [Object], [Object] ] } ]

我需要遍历rallyResults数组,当rallyResults.ExecutionType为"回归"时,我需要遍历rallyResults.dataArray,并对rallyResults.dataArray中的每个项目进行一些处理。我只想在处理rallyResults.dataArray中的所有项目时返回。
我为代码尝试了几次不同的迭代而没有成功。这就是我现在编码的内容。
ProcessDatabase.prototype.ckForAddToSet = function (rallyResults) {
return new Promise((resolve, reject) => {
var module = this;
console.log('In ckForAddToSet')
//console.log('rallyResults', rallyResults);
rallyResults.forEach(function (entry) {
//console.log('in ckForAddToSetentry', entry);
if (entry.ExecutionType == 'regresstion' || entry.ExecutionType
== 'smoke') {
entry.dataArray.reduce(function (p, val) {
return p.then(function () {
return module.addTestCaseToSet(val);
});
}, Promise.resolve()).then(function (addResults) {
console.log('addResults ', addResults);
}, function (err) {
console.log('error in reduce in ckForAddToSet', err);
});
}
});
})
}

它开始遍历rallyResults并找到第一个项目,其中rallyResults.ExecutionType =' regression',调用entry.dataArray.reduce。
它通过module.addTestCaseToSet方法处理所有dataArray记录,就像我需要它并返回并打印console.log(' addResults',addResults);来自.reduce中的promise.resolve。
然后停止。
我还没弄清楚如何让它继续迭代剩余的拉力赛结果项目。当我从.reduce中的module.addTestCaseToSet方法返回时,我确实尝试了解决方案,但是这结束了整个过程并且仍然没有处理所有的rallyResult项目。
这是addTestCaseToSet方法
ProcessDatabase.prototype.addTestCaseToSet = function (data) {
return new Promise((resolve, reject) => {
console.log('in addTestCaseToSet', data);
var dataValues = {
data: [],
tcvalues: []
}
dataValues.data = data;
//console.log('dataValues.data', dataValues.data);
rallyApi.getTestCase(dataValues.data.TestCaseId).then((values) => {
dataValues.tcvalues = values;
//console.log('dataValues = ',dataValues);
resolve(dataValues);
}, err => { reject('… failed finding testCase ' + dataValues.data.TestCaseId, err); });
}).then(function (dataValues) {
var module = this;
var addToSet = [];
const promise = new Promise((resolve, reject) => {
rallyApi.addTestCaseToSet(dataValues.tcvalues.ObjectID, dataValues.tcvalues.Ref, dataValues.data.TsObjectId, dataValues.data.TsRef).then((results) => {
addToSet = results;
resolve(addToSet);
}, (err) => { reject(err); });
});
results.push(promise.then(() => {
addResults.push(addToSet);
},
err => { console.log('… failed', err); throw err; }
));
return Promise.all(results).then(() => addResults);
})
}

module.addTestCaseToSet的结果如下:
addResults [ { tsRef: 'https://rally1.rallydev.com/slm/webservice/v2.0/testset/203724645320',
tcRef: 'https://rally1.rallydev.com/slm/webservice/v2.0/testcase/152495978580',
action: 'added' },
{ tsRef: 'https://rally1.rallydev.com/slm/webservice/v2.0/testset/203724645320',
tcRef: 'https://rally1.rallydev.com/slm/webservice/v2.0/testcase/192221079432',
action: 'added' },
{ tsRef: 'https://rally1.rallydev.com/slm/webservice/v2.0/testset/203724645320',
tcRef: 'https://rally1.rallydev.com/slm/webservice/v2.0/testcase/128260769452',
action: 'added' }]

非常感谢您的帮助。
答案 0 :(得分:1)
CREATE VIEW TEST AS
SELECT
T1.DATE,
T1.ACTNBR,
CASE WHEN EXISTS (SELECT COLUMN1 FROM TABLE T2 WHERE T2.ACTNBR = T1.ACTNBR AND T2.DATE = T1.DATE)
THEN calculation1
ELSE calculation2
END CAL_COLUMN
FROM TABLE T1
和ProcessDatabase.addTestCaseToSet()
都不需要明确的ProcessDatabase.ckForAddToSet()
。有很多机会回归自然发生的承诺。
new Promise()
看起来过于复杂,而且在ProcessDatabase.addTestCaseToSet()
/ addToSet
/ addResults
方面相当混乱。
最简单的是,results
可能写成如下:
ProcessDatabase.addTestCaseToSet()
在ProcessDatabase.prototype.addTestCaseToSet = function(data) {
return rallyApi.getTestCase(data.TestCaseId)
.then(values => rallyApi.addTestCaseToSet(values.ObjectID, values.Ref, data.TsObjectId, data.TsRef))
.catch(err => {
throw new Error('… failed adding testCase ' + data.TestCaseId + ' (' + err.message + ')');
});
};
的重写中,做出以下假设:
ProcessDatabase.addTestCaseToSet()
返回结果或承诺结果(不是承诺数组)。在rallyApi.addTestCaseToSet()
中,模式ProcessDatabase.ckForAddToSet()
仅部分符合串行呼叫rallyResults.forEach(function(entry) => { ...; entry.dataArray.reduce(...) });
的目标。为了完全实现该目标,需要使用用于内循环的相同module.addTestCaseToSet(data)
模式替换外循环(.forEach()
)。
尝试这样的事情:
.reduce()
可能还有一些工作要做,但这应该更接近你想要的。