Javascript Vue JS承诺顺序与并行
我在VueJS中有工作代码,但需要特定块才能按顺序运行:Javascript Vue JS承诺顺序与并行,javascript,ajax,promise,vue.js,Javascript,Ajax,Promise,Vue.js,我在VueJS中有工作代码,但需要特定块才能按顺序运行: return Promise.all(this.vm.multipleActions.run.map(function (testRun) { return self.initiateTest(testRun); })) 目前,它似乎是并行运行的——因此在initiateTest()中,我将记录插入到数据库中,但是并行会使我随机排序,而不是按顺序(我希望保留)运行测试 我可以观察到initiateTest()中的AJAX
return Promise.all(this.vm.multipleActions.run.map(function (testRun) {
return self.initiateTest(testRun);
}))
目前,它似乎是并行运行的——因此在initiateTest()中,我将记录插入到数据库中,但是并行会使我随机排序,而不是按顺序(我希望保留)运行测试
我可以观察到initiateTest()中的AJAX调用是由于并行性而随机进行的。要让它们按顺序运行,需要在上一个测试完成后调用
initiateTest
var promise = Promise.resolve();
this.vm.multipleActions.run.forEach(function (testRun) {
promise = promise.then(function() {
return self.initiateTest(testRun);
});
})
return promise;
此代码将创建一个立即解决的初始承诺。每个测试运行都附加到承诺的then处理程序,因此它们仅在前一个承诺得到解决后执行
或者,为了进一步缩短,您可以使用reduce
:
return this.vm.multipleActions.run.reduce(function (promise, testRun) {
return promise.then(function() {
return self.initiateTest(testRun);
});
}, Promise.resolve())
如果您希望在返回的承诺中返回
self.initiateTest(testRun)
的结果,就像您的代码使用promise.all
一样,您可以像这样使用数组reduce函数
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
是什么
返回的承诺将解析为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([]));
在这之前,你能用你想要执行的东西来预测这个问题吗