1

ご存じのとおり、async.parallel は次のようなコードで定義されています。

async.parallel([
    function (callback) {
        callback(err, objects);
    },
    function (callback) {
        callback(err, status);
    },
    function (callback) {
        callback(err, status);
    },
], function (err, results) {
    //smth with results[N] array...
});

すべてのタスクをまとめて並行して実行します。ただし、2番目と3番目の関数で使用できるようにするには、最初の関数(objects正確には )のコールバック結果が必要です。つまり、最初のステップ – 1 番目の関数、2 番目 – (2 番目 + 3 番目は 1 番目の結果と平行)。async.waterfall悪い考えのようです 原因:

  1. ウォーターフォール関数では並列に動作できません
  2. スタックのすべての結果にアクセスすることはできず、最後にしかアクセスできません。

何か案は?ありがとう!

4

2 に答える 2

1

非同期を使用する必要はありません。非同期では、基本的にアプリをブラックボックス化しています。私は簡単なタスクの魔法が好きではないので、vanilla js:

var f1 = function (cb){
    ...
    cb (null, "result from f1"); //null error
};

var f2 = function (resultFromF1, cb){
    ...
    cb (null); //null error
};

var f3 = function (resultFromF1, cb){
    ...
    cb (null); //null error
};


var main = function (cb){
    f1 (function (error, resultFromF1){
        if (error) return cb ([error]);

        var errors = [];
        var remaining = 2;
        var finish = function (error){
            if (error) errors.push (error); 
            if (!--remaining){
                //f2 and f3 have finished
                cb (errors.length ? errors : null);
            }
        };

        f2 (resultFromF1, finish);
        f3 (resultFromF1, finish);
    });
};

main (function (errors){
    if (errors) return handleError (errors); //errors is an array
    ...
});
于 2013-07-11T07:39:35.570 に答える
1

waterfallとの両方が必要ですparallel

function thing1(callback) {...callback(null, thing1Result);}
function thing2A(thing1Result, callback) {...}
function thing2B(thing1Result, callback) {...}
function thing2(thing1Result, callback) {
    async.parallel([
      async.apply(thing2A, thing1Result),
      async.apply(thing2B, thing1Result)
    ], callback);
}
async.waterfall([thing1, thing2], function (error) {
    //all done
});
于 2013-07-11T03:32:42.797 に答える