11

I need to do the code like following:

function taskFirst(k, v) {
    console.log(k, v);
}

function taskSecond(k, v) {
    console.log(k, v);
}

function run() {
    var g1 = "Something";
    var g2 = "Something";
    var g3 = "Something";
    var g4 = "Something";

    async.series(
        [
            taskFirst(g1, g2),
            taskSecond(g3, g4)
        ],
        function(error, result){

        }
    );
}

What is the right way to pass custom variables and async.js callback function?

All Workers Are Essential
  • 15,826
  • 38
  • 96
  • 129
Dmitry
  • 191
  • 2
  • 11

4 Answers4

20

You could do something like this:

function taskFirst(k, v, callback) {
    console.log(k, v);

    // Do some async operation
    if (error) {
        callback(error);
    } else {
        callback(null, result);
    }
}

function taskSecond(k, v, callback) {
    console.log(k, v);

    // Do some async operation
    if (error) {
        callback(error);
    } else {
        callback(null, result);
    }
}

function run() {
    var g1 = "Something";
    var g2 = "Something";
    var g3 = "Something";
    var g4 = "Something";

        async.series(
            [
                // Here we need to call next so that async can execute the next function.
                // if an error (first parameter is not null) is passed to next, it will directly go to the final callback
                function (next) {
                    taskFirst(g1, g2, next);
                },
                // runs this only if taskFirst finished without an error
                function (next) {
                    taskSecond(g3, g4, next);    
                }
            ],
            function(error, result){

            }
        );
}
Community
  • 1
  • 1
Ali
  • 473
  • 2
  • 7
2

It can be as follows

function taskFirst(k, v) {
    console.log(k, v);
}

function taskSecond(k, v) {
    console.log(k, v);
}

async.series([
    function(callback) { 
        callback(null, taskFirst(g1, g2));
    },
    function(callback) { 
        callback(null, taskFirst(g3, g4));
    }
],function(error, result){

});
Fizer Khan
  • 71,869
  • 26
  • 133
  • 149
  • This won't work. The callback is executed immediately so async will move on to the next function. You should pass the callback to your function and all execute it one your asynchronous work is complete. – Douglas Ferguson Feb 15 '15 at 23:49
  • Yes - this answer assumes the code inside taskFirst is blocking. – 64_ Feb 26 '15 at 18:17
2

This answer to async's github issue has worked for me perfectly. https://github.com/caolan/async/issues/241#issuecomment-14013467

for you it would be something like:

var taskFirst = function (k, v) {
   return function(callback){
      console.log(k, v);
      callback();
   }
};
Juan Solano
  • 1,075
  • 1
  • 17
  • 29
1

Better way.

const a1 = (a, callback) => {
    console.log(a, 'a1')
    callback()
}
const a2 = (a, callback) => {
    console.log(a, 'a2')
    callback()
}

const run = () => {
    async.series([
        a1.bind(null, 'asd'),
        a2.bind(null, 'asd2')
    ], () => {
        console.log('finish')
    })
}
run()
Diego Mello
  • 4,267
  • 3
  • 15
  • 21