2013-09-30 39 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