序列化js promises调用列表

时间:2013-09-30 16:15:59

标签: javascript promise q

序列化一堆承诺函数调用最方便的方法是什么?

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
})

1 个答案:

答案 0 :(得分:9)

您可以在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;

您可以使用reduce:

使其更紧凑
return funcs.reduce(function (soFar, f) {
    return soFar.then(f);
}, Q(initialVal));

或者,您可以使用超紧凑版本:

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

你有它。直接从马的嘴里。