The "err" argument when using Async waterfall in node.js

V_H picture V_H · Jan 6, 2011 · Viewed 8.7k times · Source

I am trying to execute a series of functions, each passing the callback to the next. Right now it looks like this (excuse any minor errors, I am rewriting it as I post!):

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

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

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

My first question is that I'm not sure how to start this function gracefully, since it can't take an input. I'm going to eventually wrap that one in a local function, but it still makes me slightly uneasy.

Secondly, while this works, I have no idea how the "err" argument plays into this. If I try to insert it into the list of arguments, it breaks in various ways. I'd like to be able to catch an error in any function individually - or is this needed, since I have an error on the last callback which is passed down?

Answer

Ivo Wetzel picture Ivo Wetzel · Jan 6, 2011

Waterfall is normally used with anonymous functions, therefore the parameters come from the outer scope.

How the err works is simple, when you supply anything that evaluates to true as the first argument of the callback function waterfall will stop and call the main callback.

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
    });
}