web-dev-qa-db-ja.com

async.waterfallとasync.seriesの違いは何ですか

Nodejs非同期モジュール: https://github.com/caolan/async は、2つの同様のメソッド、async.waterfallおよびasync.series

それらの違いは何ですか?

109
Bruce Dou

async.waterfallは、各関数がその結果を次の関数に渡すことを許可し、async.seriesは、すべての結果を最終的なコールバックに渡します。より高いレベルでは、async.waterfallはデータパイプライン用(「2を与え、3を乗算し、2を加算し、17で除算する」)であるが、async.seriesは、順番に実行する必要がある個別のタスク用ですが、それ以外の場合は分離されます。

162
Twisol

両方の関数は、すべての関数の戻り値を次の関数に渡し、完了時にメインコールバックを呼び出し、エラーが発生した場合はそのエラーを渡します。

違いは、async.series()は、シリーズが終了すると、すべての結果をメインコールバックに渡すことです。 async.waterfall()は、最後に呼び出された関数の結果のみをメインコールバックに渡します。

51
Mario

async.waterfall() は_action that relies on the previous outcome_を処理しています。

async.series() は_see all the result at the end_を必要とするアクションを処理しています

27
Wayne Chiu

Async.waterfallは有害であると考えます。なぜなら、一度記述するとリファクタリングするのが難しく、さらに引数を追加すると他の関数がシグネチャを大きく変えるため、エラーが発生しやすいからです。

async.autoInjectは、async.waterfallの優れた代替手段です。 https://caolan.github.io/async/autoInject.js.html

Async.waterfallを使用する場合は、すべてを1つのオブジェクトに保存することをお勧めします。そのため、関数は次のように長さ/署名を変更する必要がありません。

警告:これは悪いパターンです

async.waterfall([
  cb => {
    cb(null, "one", "two");
  },
  (one, two, cb) => {
    cb(null, 1, 2, 3, 4);
  },
  (one,two,three,four,cb) => {
     // ...
  }
])

上記のようにしないでください。これはより良いパターンを使用することです:

async.waterfall([
  cb => {
    cb(null, {one:"one", two:"two"});
  },
  (v, cb) => {
    cb(null, [1, 2, 3, 4]);
  },
  (v,cb) => {
     // ...
  }
])

そうすれば、関数の引数が適切な長さであることを確認しようとして髪の毛を引っ張ることはありません。最初の関数は、コールバックの1つの引数のみを受け入れます。残りの引数はすべて、値とコールバックの2つの引数を受け入れる必要があります。パターンに固執すると、正気のままになります!

1
Alexander Mills