Javascript Vue JS承诺顺序与并行

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

我在VueJS中有工作代码,但需要特定块才能按顺序运行:

  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([]));

在这之前,你能用你想要执行的东西来预测这个问题吗