遅延モジュールを使用してNode.jsで最初の遅延オブジェクトを作成しましたが、結果を次の関数に渡し、解決と拒否をトリガーするとうまく機能します。関数の入力パラメーター配列と、最初の関数の入力パラメーターと、次のすべての関数が前のパラメーターを取得するようにしています。
f1(100).then(f2).then(f3)
と同じように機能しますが、n個の関数がある場合はどうなりますか。
ループ内でプロミスチェーンを構築する必要があります:
var promise = funcs[0](input);
for (var i = 1; i < funcs.length; i++)
promise = promise.then(funcs[i]);
同じ考えですが、少し上品であるか、よりコンパクトであることがわかります。
_funcs.reduce((prev, cur) => prev.then(cur), starting_promise);
_
使用する特定の_starting_promise
_がない場合は、Promise.resolve()
を使用します。
@torazaburoに基づいて、「不幸な道」を追加することもできます
funcs.reduce(function(prev, cur) {
return prev.then(cur).catch(cur().reject);
}, starting_promise);
ES6、追加の引数を許可:
function chain(callbacks, initial, ...extraArgs) {
return callbacks.reduce((prev, next) => {
return prev.then((value) => next(value, ...extraArgs));
}, Promise.resolve(initial));
}
2017年のES7の方法。 http://plnkr.co/edit/UP0rhD?p=preview
async function runPromisesInSequence(promises) {
for (let promise of promises) {
console.log(await promise());
}
}
これは、与えられた関数を並列ではなく、順番に(1つずつ)実行します。パラメータpromises
は、Promise
を返す関数のコレクション(Promise
sではない)です。
可能な空のfuncs
配列の場合:
var promise = $.promise(function(done) { done(); });
funcs.forEach(function(func) {
promise = promise.then(func);
});