Аргумент "err" при использовании асинхронного водопада в node.js - PullRequest
7 голосов
/ 06 января 2011

Я пытаюсь выполнить ряд функций, каждая из которых передает обратный вызов следующей. Прямо сейчас это выглядит так (извините за любые незначительные ошибки, я переписываю это, когда я отправляю!):

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

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

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

Мой первый вопрос: я не уверен, как правильно запустить эту функцию, поскольку она не может принимать данные. Я собираюсь в конце концов обернуть его в локальную функцию, но это все равно делает меня немного неловким.

Во-вторых, хотя это работает, я понятия не имею, как аргумент "err" влияет на это. Если я пытаюсь вставить его в список аргументов, он ломается по-разному. Я хотел бы иметь возможность отлавливать ошибки в любой функции по отдельности - или это необходимо, так как у меня есть ошибка в последнем обратном вызове, который передается?

Ответы [ 2 ]

15 голосов
/ 06 января 2011

Водопад обычно используется с анонимными функциями, поэтому параметры поступают из внешней области видимости.

Как работает 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
    });
}
0 голосов
/ 26 февраля 2018

Вы можете использовать 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 = "нечто"

Документация: https://caolan.github.io/async/docs.html#constant и https://caolan.github.io/async/docs.html#waterfall

...