5

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

我认为这会做到这一点:

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

我怎样才能确保在这里完全按顺序执行?

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

4

1 回答 1

2

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

.mapand .filter.reduce现在允许从迭代函数返回 Promise 和 thenables。

来自变更日志

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

于 2014-03-04T15:19:46.950 回答