4

約束された関数呼び出しの束をシリアル化する最も便利な方法は何ですか?

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

1 に答える 1

10

ドキュメントで解決策を見つけることができます:

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());

そこにあります。馬の口から真っ直ぐに。

于 2013-09-30T16:25:28.760 に答える