2014-03-04 44 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的