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