使用promises顺序执行函数

时间:2014-03-04 15:12:11

标签: javascript node.js promise bluebird

我想基于数组顺序执行一些异步函数。

我以为会这样做:

var Promise = require("bluebird");
Promise.cast([1,2,3]).reduce(function(_,i){
    console.log("Launching  " + i);
    return Promise.delay(Math.floor(Math.random()*1000)).then(function(){
        console.log("Executing  " + i);
    });
},0);

但我得到

Launching  1
Launching  2
Launching  3
Executing  2
Executing  1
Executing  3

而不是期望的结果

Launching  1
Executing  1
Launching  2
Executing  2
Launching  3
Executing  3

如何确保完全按顺序执行?

请注意,我知道如何在没有承诺的情况下做到这一点,我只对完整的承诺解决方案感兴趣。

1 个答案:

答案 0 :(得分:2)

您使用的是旧版Bluebird。 .reducev1的行为已更改为以这种方式工作:

  

.map.filter类似,.reduce现在允许从迭代函数返回promises和thenable。

from the changelog

请更新到最新版本。这将导致代码正确运行。