有趣的callback

696 查看

这是一个简单的问题,如果你对async已经非常熟悉了,那就不要看了。

最初的代码是这样的:

var async=require('async');
async.parallel([function(callback){
    callback(null);
},function(callback){
    callback(null);
}],function(err){
    console.log("我是parallel的callback");
});

执行结果为:

我是parallel的callback

虽然两处都调用了callback,但是callback只执行了一次。

在parallel的第一个方法中加入一个waterfall

var async=require('async');
async.parallel([function(callback){
    async.waterfall([function(callback){
        callback(null,"abc");
    },function(arg1,cb){
        console.log("waterfall第一个函数传来的参数为:"+arg1);
        callback(null,"bgd");
    }],function(err,restult){
        console.log("我是waterfall的callback");
        console.log("执行的最终结果是:"+restult);        
    });
    //callback(null);
},function(callback){
    callback(null);
}],function(err){
    console.log("我是parallel的callback");
});

执行结果为:

waterfall第一个函数传来的参数为:abc
我是parallel的callback

可见,此时在waterfall中调用callback依旧是调用的parallel中的callback。

而且将上述代码中的注释行取消注释,则会报一个重复调用callback的错误。

替换waterfall中的callback为cb。

var async=require('async');
async.parallel([function(callback){
    async.waterfall([function(cb){
        cb(null,"abc");
    },function(arg1,cb){
        console.log("waterfall第一个函数传来的参数为:"+arg1);
        cb(null,"bgd");
    }],function(err,restult){
        console.log("我是waterfall的callback");
        console.log("执行的最终结果是:"+restult);        
    });
    callback(null);
},function(callback){
    callback(null);
}],function(err){
    console.log("我是parallel的callback");
});

执行结果:

我是parallel的callback
waterfall第一个函数传来的参数为:abc
我是waterfall的callback
执行的最终结果是:bgd

有个现象非常有趣:parallel的callback是先执行的,我觉得这种异步还是要注意一下的。

把callback移到cb里面去,就OK了,这个比较好理解。

var async=require('async');
async.parallel([function(callback){
    async.waterfall([function(cb){
        cb(null,"abc");
    },function(arg1,cb){
        console.log("waterfall第一个函数传来的参数为:"+arg1);
        cb(null,"bgd");
    }],function(err,restult){
        console.log("我是waterfall的callback");
        console.log("执行的最终结果是:"+restult);
        callback(null);        
    });
    
},function(callback){
    callback(null);
}],function(err){
    console.log("我是parallel的callback");
});

执行结果:

waterfall第一个函数传来的参数为:abc
我是waterfall的callback
执行的最终结果是:bgd
我是parallel的callback


结论:

在这种异步嵌套异步的情况下,应该注意callback的命名,区分一下,以防出错。