使用async.series时不会调用回调

时间:2015-03-09 15:42:08

标签: node.js asynchronous async.js

我有以下代码,我在异步任务完成后调用回调:

var async = require("async");

function _callback(err, result){
    if(err) console.log('Error Occurred');
    console.log('Callback called');
    console.dir(result);
}

function tasks() {
    console.log('Start executing tasks');
    var tasks = [];
    var result = {};

    tasks.push(function(_callback) {
        console.log('Getting some data');
        _callback(null, result);
    });
    tasks.push(function(_callback) {
        console.log('Second function called');
        _callback(null, result);
    });

    async.series(tasks, function(){
        console.log('All done');
    });
}

tasks();

我已经检查了异步库中预期的语法。代码看起来与我类似。

有人可以指出这里需要改变什么。

3 个答案:

答案 0 :(得分:1)

试试这样:

var async = require("async");

function _callback(err, result){
    if(err) console.log('Error Occurred');
    console.log('Callback called');
    console.dir(result);
}

function tasks() {
    console.log('Start executing tasks');
    var tasks = [];
    var result = {};

    tasks.push(function(next) {
        console.log('Getting some data');
        next(null, result);
    });
    tasks.push(function(_callback) {
        console.log('Second function called');
        next(null, result);
    });

    async.series(tasks, function(err, result){
        console.log('All done');
        _callback(err, result);
    });
}

tasks();

Async为每个任务提供一个回调,您需要调用该回调以便在此任务完成时让异步。 完成所有任务后,您可以拨打回叫。 如果您希望在每个任务完成后调用回调,则只需在每个任务之前添加 next(null, result)也是_callback(null, result) 对您的实现无效的原因是您使用具有相同名称的参数覆盖global _callback方法。

希望有道理:)

答案 1 :(得分:1)

正如你现在的代码所示,上面定义的_callback函数永远不会被调用,因为任务函数中的_callbackasync传递的范围。

// this will never get called
function _callback(err, result){
    if(err) console.log('Error Occurred');
    console.log('Callback called');
    console.dir(result);
}

function tasks() {
    console.log('Start executing tasks');
    var tasks = [];

    tasks.push(function(_callback) { // the _callback here overrides the one above for this closure
        console.log('Getting some data');
        _callback(null, result);
    });
    // ... more tasks

    async.series(tasks, function(){
        console.log('All done');
    });
}

如果您想重用_callback函数中的逻辑,我建议将async回调作为参数传递给它:

// rename some functions to avoid silly js scoping mysteries
function myCallback(err, result, asyncCallback){
    // shared logic here
    if(err) console.log('Error Occurred');
    console.log('Callback called');
    console.dir(result);

    asyncCallback(null, result);
}

// ...

tasks.push(function(asyncCallback) { // the _callback here overrides the one above for this closure
    console.log('Getting some data');
    myCallback(null, result, asyncCallback);
});
// ... more tasks

async希望调用它的回调,以便它知道何时继续,但这并不意味着你不能用自己的处理程序拦截它:P。

答案 2 :(得分:0)

您不需要对_callback进行函数调用。你可以像这样简化它。

var async = require("async");

function doSomeLogic(item, callback) {
    console.log(item);
    callback(null, item + 2);
}

function tasks() {
    console.log('Start executing tasks');
    var tasks = [];
    var result = {};

    tasks.push(function(callback){
        // do some more stuff ...
        callback(null, 'one');
    });

    tasks.push(function(callback){
        // do some more stuff ...
        callback(null, 'two');
    });


    async.series(tasks, function(error, results) {
        if (error) {
            console.log(error);
        }
        console.log(results);
        console.log('All done');
    });
}

tasks();