web-dev-qa-db-ja.com

すべての関数がdeferred.promiseを返すときに関数の配列の実行をチェーンする方法は?

遅延モジュールを使用してNode.jsで最初の遅延オブジェクトを作成しましたが、結果を次の関数に渡し、解決と拒否をトリガーするとうまく機能します。関数の入力パラメーター配列と、最初の関数の入力パラメーターと、次のすべての関数が前のパラメーターを取得するようにしています。

f1(100).then(f2).then(f3)と同じように機能しますが、n個の関数がある場合はどうなりますか。

37
PaolaJ.

ループ内でプロミスチェーンを構築する必要があります:

var promise = funcs[0](input);
for (var i = 1; i < funcs.length; i++)
    promise = promise.then(funcs[i]);
44
SLaks

同じ考えですが、少し上品であるか、よりコンパクトであることがわかります。

_funcs.reduce((prev, cur) => prev.then(cur), starting_promise);
_

使用する特定の_starting_promise_がない場合は、Promise.resolve()を使用します。

76
user663031

@torazaburoに基づいて、「不幸な道」を追加することもできます

funcs.reduce(function(prev, cur) {
  return prev.then(cur).catch(cur().reject);
}, starting_promise); 
6
Simon H

ES6、追加の引数を許可:

function chain(callbacks, initial, ...extraArgs) {
 return callbacks.reduce((prev, next) => {
   return prev.then((value) => next(value, ...extraArgs));
 }, Promise.resolve(initial));
}
5
jchook

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を返す関数のコレクション(Promisesではない)です。

4
allenhwkim

可能な空のfuncs配列の場合:

var promise =  $.promise(function(done) { done(); });
funcs.forEach(function(func) {
  promise = promise.then(func);         
});
0
GKislin