我知道这可能是一个非常基本的问题,但我只是在学习并且陷入困境。我不能全神贯注于该怎么做。
我有一个名为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);从promise.resolve在.reduce中。
然后停止。
我还没弄清楚如何让它继续遍历其余的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' }]
您的帮助将不胜感激。
最佳答案
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()
模式。尝试这样的事情:
ProcessDatabase.prototype.ckForAddToSet = function(rallyResults) {
var module = this;
return rallyResults
.filter(entry => entry.ExecutionType === 'regression' || entry.ExecutionType == 'smoke')
.map(entry => entry.dataArray)
.reduce((promise0, dataArray) => {
return promise0.then(arr0 => {
return dataArray.reduce((promise1, data) => {
return promise1.then(arr1) => {
return module.addTestCaseToSet(data)
.then(result1 => {
arr1.push(result1);
return arr1;
});
});
}, Promise.resolve([]))
.then(result0 => {
arr0.push(result0);
return arr0;
});
});
}, Promise.resolve([]))
.then(addResults => {
console.log('addResults ', addResults); // addResults will be an array of arrays.
}, err => {
console.log('error in reduce in ckForAddToSet', err);
});
};
可能仍有一些工作要做,但这应该更接近您想要的。
关于javascript - 遍历数组,然后在带有promise的数组上调用.reduce,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49161813/