【发布时间】:2018-08-16 03:20:54
【问题描述】:
我知道这可能是一个非常基本的问题,但我只是在学习并且被卡住了。我无法思考如何在这里做我需要做的事情。
我有一个名为 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 为“Regression”时,我需要遍历 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。
然后停止。
我无法弄清楚如何让它继续遍历剩余的 rallyResults 项目。当它从 .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' }]
非常感谢您的帮助。
【问题讨论】:
-
module.addTestCaseToSet()返回什么? -
我在最初的帖子中添加了从 module.addTestCaseToSet 返回的内容。放在这里太长了。
-
我真的只想知道
module.addTestCaseToSet(val);是否返回。 -
哦,好的。我认为确实如此。我说我认为是因为那是我的意图。但是因为我对此真的很陌生。它可能没有正确编码。我也在最初的帖子中添加了该方法。
-
好的,
ProcessDatabase.addTestCaseToSet()肯定会返回一个承诺,尽管代码应该会大大简化。您选择连续调用该方法(使用.reduce()模式)是否有特殊原因?如果这些调用可以并行进行,那么代码将进一步简化。
标签: javascript arrays promise