使用Promise顺序执行函数

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

我该如何确保这里完全按顺序执行?

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

1个回答

2
您正在使用旧版本的 Bluebird。在 v1 中,.reduce 的行为已更改为以下方式:

.map.filter 一样,.reduce 现在允许从迭代函数返回 promises 和 thenables。

来自更改日志
请更新到最新版本。这将使代码正确运行。

1
是的,将Bluebird升级到1.0.8版本解决了这个问题。 - Denys Séguret
1
如果有人正在阅读这篇文章,并且被困在 Bluebird 的 < v1 版本上,无法更新 - 请让我知道,我会添加一个 < v1 的答案 - 否则,我宁愿不这样做,以便更多的人升级到现代的 Bluebird。 - Benjamin Gruenbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接