7

一連の関数を実行しようとしており、それぞれがコールバックを次の関数に渡しています。現在、次のようになっています (軽微なエラーがあればすみません。投稿時に書き直しています!):

function func1(callback) {
    callback(null, "stuff");
}

function func2(input, callback) {
    callback(null, "foo" + input);
}

async.waterfall([func1, func2], function(err, result) {
    sys.puts(result);
});

私の最初の質問は、入力を受け取ることができないため、この関数を適切に開始する方法がわからないということです。最終的にはそれをローカル関数にラップするつもりですが、それでも少し不安になります。

第二に、これは機能しますが、「エラー」引数がこれにどのように影響するかわかりません。引数のリストに挿入しようとすると、さまざまな方法で壊れます。任意の関数のエラーを個別にキャッチできるようにしたいのですが、それとも、渡された最後のコールバックでエラーが発生したため、これが必要ですか?

4

2 に答える 2

17

ウォーターフォールは通常、匿名関数で使用されるため、パラメーターは外側のスコープから取得されます。

コールerrバック関数の最初の引数として true と評価されるものを指定すると、ウォーターフォールが停止し、メインのコールバックが呼び出されます。

function doStuff(foo, bla) {
    // more setup here

    async.waterfall([
        function(callback){
            try {
                // something that might explode
                callback(null, foo, bla);

            } catch (e) {
                callback(e);
            }
        },

        function(arg1, arg2, callback){
            callback(null, 'three');
        },

        function(arg1, callback){
            callback(null, 'done');
        }
    ],

    function (err, status) {
       // if the above try/catche catches something, we will end up here
       // otherwise we will receive 'done' as the value of status
       // after the third function has finished
    });
}
于 2011-01-06T19:21:21.537 に答える