0

一連の匿名関数を動的にロードして実行し、前の結果を次の結果に渡そうとしています。

関数の例を次に示します。

module.exports = function (data) {
    // do something with data
    return (data);
}

関数がロードされると (それらはすべて別々のファイルに置かれます)、オブジェクトとして返されます。

{ bar: [Function], foo: [Function] }

これらの関数を async.waterfall を使用して実行したいと思います。これは、関数のオブジェクトではなく、関数の配列を取るため、次のように変換します。

var arr =[];
        for( var i in self.plugins ) {
            if (self.plugins.hasOwnProperty(i)){
                arr.push(self.plugins[i]);
            }
        }

これは与える:

[ [Function], [Function] ]

各 async.waterfall を使用して各関数を実行し、前の関数の結果を次の関数に渡すにはどうすればよいですか?


解決

@piergiaj からのコメントのおかげで、関数で next() を使用しています。最後のステップは、着信データを渡すことができる事前定義された関数が配列の最初に配置されていることを確認することでした。

var arr =[];

    arr.push(function (next) {
        next(null, incomingData);
    });

    for( var i in self.plugins ) {
        if (self.plugins.hasOwnProperty(i)){
            arr.push(self.plugins[i]);
        }
    }

    async.waterfall(arr,done);
4

1 に答える 1

1

各関数の最後に戻るのではなく、async.waterfall を使用して次の関数にデータを渡したい場合は、next() メソッドを呼び出す必要があります。さらに、next を各関数の最後のパラメーターにする必要があります。例:

module.exports function(data, next){
    next(null, data);
}

async.waterfall はエラーとして処理するため、next の最初のパラメーターは null でなければなりません (メソッドの 1 つでエラーが発生した場合は、そこに渡すと、async.waterfall は実行を停止し、エラーを最終メソッドに渡します)。 .

次に、既に行っているように (オブジェクトから配列へ) 変換し、次のように呼び出します。

async.waterfall(arrayOfFunctions, function (err, result) {
     // err is the error pass from the methods (null if no error)
     // result is the final value passed from the last method run    
  });
于 2014-08-02T00:49:52.600 に答える