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 回答
2

您可以使用 async.constant 将输入传递给链中的第一个函数:

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

并修改第一个功能当然:

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

可选:您可以使用非空的第一个参数调用回调:

 function func1(input,callback) {
        callback("something");
    }

在这种情况下,链停止,最后一个函数将被调用 err="something"

文档:https ://caolan.github.io/async/docs.html#constant和https://caolan.github.io/async/docs.html#waterfall

于 2018-02-26T14:15:06.783 回答