nodejs非同期モジュール:https://github.com/caolan/asyncは 2と同様の方法を提供し、async.waterfall
そしてasync.series
。
それらの違いは何ですか?
nodejs非同期モジュール:https://github.com/caolan/asyncは 2と同様の方法を提供し、async.waterfall
そしてasync.series
。
それらの違いは何ですか?
回答:
async.waterfall
各関数がその結果を次の関数にasync.series
渡し、すべての結果を最後のコールバックに渡すことができるようです。より高いレベルでasync.waterfall
は、データパイプライン(「2を指定すると、3を乗算し、2を加算し、17で除算する」)の場合async.series
、順序どおりに実行する必要があるが、それ以外の場合は個別のタスクの場合です。
waterfall
もseries
値を返しません。結果が何であれ、オプションのコールバックパラメータで使用されることが期待されます。
どちらの関数も、すべての関数の戻り値を次の関数に渡します。エラーが発生した場合は、完了時にメインのコールバックを呼び出してエラーを渡します。
違いはasync.series()
、シリーズが終了すると、すべての結果がメインのコールバックに渡されるということです。async.waterfall()
最後に呼び出された関数の結果のみをメインのコールバックに渡します。
async.waterfall()
を扱っていaction that relies on the previous outcome
ます。
async.series()
したいアクションを扱っています see all the result at the end
私は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つの引数-値とコールバックを受け入れる必要があります。パターンに固執すれば、正気のままです!