Async: 各タスクが以前のすべてのタスクの結果を受け取るasync.seriesのバージョン

作成日 2015年11月16日  ·  5コメント  ·  ソース: caolan/async

async.seriesタスクが以前のいくつかのタスクの結果を必要とする状況に頻繁に遭遇します。 async.waterfallは、前の最後のタスクの結果のみを提供するため、不十分です。 async、autoは冗長すぎて、追加の不要な依存関係宣言を提供します。

新しい関数(またはasync.seriesの改良)が役に立ちます。 各タスクは、以前のすべてのタスクの結果を含む結果オブジェクトを受け取ります

可能な名前:accumulate、seriesAccumulate

例:

async.accumulate({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: function(callback, results){
        // results: {one: 1}
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    },
    three: function(callback, results){
         // results: {one: 1, two: 2}
        setTimeout(function(){
            callback(null, results.one + results.two);
        }, 100);
    }
},
function(err, results) {
    // results is now equal to: {one: 1, two: 2, three: 3}
});
feature question

全てのコメント5件

async.autoをチェックアウトしましたか? それはあなたが説明することと非常に似た何かをします。

先に述べたように、単純な一連のシナリオでは、async.autoが冗長すぎます。ユーザーは、各ステップが前のステップに依存していることを宣言する必要があり、その結果、これらの醜い配列と重複するステップ名が発生します。

async.auto({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: ["one", function(callback, results){
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    }],
    three: ["two", function(callback, results){
        setTimeout(function(){
            callback(null, results.one + results.two);
        }, 100);
    }
   ]
},
function(err, results) {
    // results is now equal to: {one: 1, two: 2, three: 3}
});

次のメジャーリリースでは、autoにいくつかの機能拡張を行う予定です。常にコールバックを最後にし、パラメーター名から依存関係を推測するautoInject (#608)も追加します。

この提案は、オブジェクトキーの順序に依存しているため、私は好きではありません。これは、JS環境全体で保証されていない(そして、小さなオブジェクトのノードでのみ保証されている)ものです。 配列を使用することは可能ですが、 async.waterfallとあまりにも似ています。 autowaterfall間に何かが必要かどうかはわかりません。特に、 autoInject追加する場合はそうです。

あなたが望むことを達成する方法:

function seriesAccumulate(tasks, done) {
  async.reduce(tasks, [], function (results, task, next) {
    task(results, function (err, result) {
      results.push(result);
      next(err, result);
    });
  }, done);
}

オブジェクトを使用して連続して反復しようとしないことをお勧めします。

これを閉じます。 serieswaterfallスタイルで別のメソッドは必要ないと思います。

このページは役に立ちましたか?
0 / 5 - 0 評価