2014-03-04 63 views
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 

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

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

回答

2

您正在使用老版本的蓝鸟。的.reduce的行为v1改为以这种方式工作:

.map.filter.reduce现在允许从迭代函数返回的承诺和thenables。

from the changelog

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

+1

是的,升级Bluebird到1.0.8修复了这个问题。 –

+1

如果有人正在阅读本文并且被卡住在Bluebird的