Vue JS承诺顺序与并行

时间:2017-08-31 01:02:12

标签: javascript ajax promise vue.js

我在VueJS中有工作代码但是需要一个特定的块来顺​​序运行:

  return Promise.all(this.vm.multipleActions.run.map(function (testRun) {
    return self.initiateTest(testRun);
  }))

目前它似乎并行运行 - 所以在initiateTest()中我将记录插入到DB中,但是parallel会按顺序获取随机排序而不是testRuns(我想保留它)。

我可以观察由于并行性质而随机生成的initiateTest()中的AJAX调用。

2 个答案:

答案 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())