首先,使用Asycn模块需要安装,它不是node自带的。其次,该模块有大约20多个流程控制方法,我们在这里仅分析常用的series, parallel, waterfall, auto这四种,并且尽量从原理上进行分析。
首先是series。顾名思义,它是控制异步函数按照串行顺序执行,只有前一个执行完毕,才能执行下一个异步调用。回调函数cb有两个参数:error和data,而它们可以为null。回调函数举个例子:
async.series([function(cb){ setTimeout(function(){ cb(null,1); },1000) },function(cb){ setTimeout(cb,1000,null,2); }],function(err,result){ //result是每个回调函数传进来的data参数,result=[1,2] if (err) console.error(err); else console.log(result); })
parallel的用法和series类似。只是数组中的函数是并行执行,parallel的总时间取决于运行时间最长的函数。而最终的回调函数里result的值是按照数组中函数的顺序排列的。
async.parallel([function(cb){ setTimeout(function(){ cb(null,1); },1000) },function(cb){ setTimeout(cb,1000,null,2); }],function(err,result){ //result=[1,2] if (err) console.error(err); else console.log(result); })
waterfall用法上有区别。waterfall中cb的参数data直接传给下一个函数,最后一个函数cb的data参数直接传给回调函数的result。
async.waterfall([function(cb){ setTimeout(function(){ cb(null,1); },1000) },function(data,cb){ setTimeout(cb,1000,null,data+"+"+"2"); }],function(err,result){ //result = "1+2" if (err) console.error(err); else console.log(result); })
以上都是API用法,下面我们试着实现一下原理。