有趣的callback

这是一个简单的问题,若是你对async已经很是熟悉了,那就不要看了。javascript

最初的代码是这样的:java

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

执行结果为:异步

我是parallel的callbackasync

虽然两处都调用了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");
});

执行结果为:ui

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

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

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

替换waterfall中的callback为cb。ip

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

执行结果:io

我是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的命名,区分一下,以防出错。

相关文章
相关标签/搜索