这是一个简单的问题,如果你对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的命名,区分一下,以防出错。