我在VueJS中有工作代码但是需要一个特定的块来顺序运行:
return Promise.all(this.vm.multipleActions.run.map(function (testRun) {
return self.initiateTest(testRun);
}))
目前它似乎并行运行 - 所以在initiateTest()中我将记录插入到DB中,但是parallel会按顺序获取随机排序而不是testRuns(我想保留它)。
我可以观察由于并行性质而随机生成的initiateTest()中的AJAX调用。
答案 0 :(得分:1)
如果要在返回的promise中返回self.initiateTest(testRun)
的结果,就像代码使用Promise.all
那样,可以使用数组缩减功能
return this.vm.multipleActions.run.reduce((promise, testRun) =>
promise.then(results =>
self.initiateTest(testRun).then(result => {
results.push(result);
return results;
})
), Promise.resolve([]) // initial promise to chain to
);
注意:如果使用箭头功能,self.initiateTest
可能是this.initiateTest
- 但不清楚代码中self
是什么
返回的promise将解析为self.initiateTest(testRun)
以上代码的非ES2015 +版本是
return this.vm.multipleActions.run.reduce(function (promise, testRun) {
return promise.then(function (results) {
return self.initiateTest(testRun).then(function (result) {
results.push(result);
return results;
});
});
}, Promise.resolve([]));
答案 1 :(得分:0)
要让它们按顺序运行,您需要在上一次测试完成后调用initiateTest
。
var promise = Promise.resolve();
this.vm.multipleActions.run.forEach(function (testRun) {
promise = promise.then(function() {
return self.initiateTest(testRun);
});
})
return promise;
此代码将创建一个立即解决的初始承诺。每个测试运行都附加到promise然后处理程序,因此只有在前一个promise已经解决后才会执行。
或者为了进一步缩短它,您可以使用reduce
:
return this.vm.multipleActions.run.reduce(function (promise, testRun) {
return promise.then(function() {
return self.initiateTest(testRun);
});
}, Promise.resolve())