Javascript 承诺在返回之前不解决
我很难弄清楚承诺是如何起作用的。我有下面的代码,我正在通过数组执行迭代Javascript 承诺在返回之前不解决,javascript,promise,reduce,Javascript,Promise,Reduce,我很难弄清楚承诺是如何起作用的。我有下面的代码,我正在通过数组执行迭代 runOpts.automationResults.reduce(函数p,val){ 返回p.then(函数(){ 返回pd.run(val); }); },Promise.resolve())。然后(函数(rallyResults){ log('从方法返回'); console.log('rallyResults',rallyResults); },函数(err){ log('error in reduce',err);
runOpts.automationResults.reduce(函数p,val){
返回p.then(函数(){
返回pd.run(val);
});
},Promise.resolve())。然后(函数(rallyResults){
log('从方法返回');
console.log('rallyResults',rallyResults);
},函数(err){
log('error in reduce',err);
});代码>此代码中存在许多问题,但主要问题是,当您在.then()
处理程序中运行另一个异步操作时,必须从.then()
返回该承诺,才能将其正确链接到主承诺链中。如果您不这样做,则父承诺根本不会链接到该内部承诺(它成为自己的独立承诺链,您无法对其进行监控),并且父承诺不会等待内部承诺
以下是所做的更改:
删除不必要地将一个承诺包装在另一个承诺中的承诺反模式(只需返回您已经拥有的承诺)
从.then()处理程序中返回嵌套的承诺以适当地链接它们
将错误日志合并到一个位置并重新显示错误,以便正确返回
删除Promise.all()
李>
移除results.push(结果数组)代码>因为似乎没有指向该点的任何点。按照我在下面编写的方式,顶级承诺解析为resultsArray
,因为只有一个,所以我认为没有必要将其嵌入到另一个数组中
以下是修改后的代码:
ProcessDatabase.prototype.run = function (options) {
var dal = new db();
var resultsArray = {
results: [],
options: {},
testSet: [],
testIteration: '',
multipleSets: 0,
totalCount: 0
}
resultsArray.options = options;
return dal.getAutomationResultsByBuild(options.Build).then((results) => {
resultsArray.results = results;
resultsArray.totalCount = results.data.length;
return resultsArray;
}).then(function (resultsArray) {
//console.log('resultsArray', resultsArray);
//console.log(`Starting Rally publishing for Build '${resultsArray.options.Build}'...`)
if (resultsArray.options.Executiontype == 'ci') {
return rallyApi.autoDiscoverTestSets().then((sets) => {
resultsArray.testSet = sets.sets;
resultsArray.testIteration = sets.iteration;
resultsArray.multipleSets = sets.sets.length > 1;
return resultsArray;
});
} else {
return rallyApi.addTestSet('Automation: ' + resultsArray.options.type + ' - ' + resultsArray.options.build, config.get('rally.projects.testing.ref'), null, resultsArray.options.SessionUser).then((resp) => {
//console.log(resp);
console.log('New test set ' + resp.FormattedID + ' created.');
resultsArray.multipleSets = 0;
resultsArray.testSet = resp.FormattedID;
return resultsArray;
});
}
}).catch(err => {
// log error and rethrow
console.log(err);
throw err;
});
}
reduce不知道承诺。这是一种同步方法。Iow:您不能在reduce中执行异步。@Keith-以这种方式使用.reduce()
是序列化异步操作的常见设计模式。如果操作得当,它绝对有效。它在数组内容中循环执行Promise.resolve().then(fn).then(fn).then(fn)
,该数组序列化对数组上异步操作的访问。您没有正确使用Promise.all()
。你需要向它传递一系列承诺。run
需要避免失败!你好,J00。谢谢你的回复。我已经更新了我最初的帖子,试图更好地解释我需要发生什么。.reduce中的数组中有多条记录。我想得到的是一个数组,其中包含了每种类型的附加信息。上面控制台日志中设置的第二个“结果”是我需要返回到调用.reduce的内容。这就是为什么我要写ProcessDatabase.prototype.run作为承诺。显然我做错了。是否可以从ProcessDatabase.prototype.run中获得整合的“结果”数组,如我所需