2013-09-30 42 views
4

序列化一串承諾的函數調用最方便的方法是什麼?序列化js承諾列表調用

var promised_functions = [ 
fn1, // call this 
fn2, // if previous resolved call this 
fn3 // if previous resolved call this 
]; 
q.serialize_functions(promised_functions) 
.then(function(){ 
// if all promises resolved do some 
}) 
+2

看看這個問題。我可能會找到你的答案:http://stackoverflow.com/questions/18386753/how-to-sequentially-run-promises-with-q-in-javascript – peernohell

回答

8

您可以找到documentation解決方案:

promised_functions.reduce(Q.when, Q()).then(function() { 
    // if all promises resolved do some 
}); 

跳轉到文檔的 「序列」 一節。要逐字複製:


如果你有一些需要按順序運行的承諾,生產功能,當然你也可以手動進行:

return foo(initialVal).then(bar).then(baz).then(qux); 

但是,如果你想使用減少

var funcs = [foo, bar, baz, qux]; 

var result = Q(initialVal); 
funcs.forEach(function (f) { 
    result = result.then(f); 
}); 
return result; 

可以使這個更爲簡潔:運行的功能,動態構建順序,你會想這樣的事情

return funcs.reduce(function (soFar, f) { 
    return soFar.then(f); 
}, Q(initialVal)); 

或者,你可以使用次超緊湊的版本:

return funcs.reduce(Q.when, Q()); 

有你有它。直接從馬的嘴巴。

+0

哎呀! 非常真實! 對不起,我一直在使用錯誤的關鍵字進行快速搜索(serie,serialize,chain ..)我沒有嘗試「序列」! 謝謝 – aleclofabbro