Node.js中的流程控制可以使用async,在使用之前需要先安装,使用npm安装
npm install async --g
下面主要介绍4种流程控制的方式:
1、串行无关联:async.series(tasks,callback)
多个函数依次执行,之间没有数据交换,其中一个函数出错,后续函数不再执行;
以下是标准写法:
async.series({ one: function(callback){ callback(null, 1); }, two: function(callback){ callback(null, 2); } },function(err, results) { console.log(results); });
为了测试,我们使用交叉执行的方式:
var async = require('async'); function exec(){ async.series({ one: function(done){ ii=0; setInterval(function(){ console.log('aaa='+new Date()); ii++; if(ii==3){ clearInterval(this); done(null,{one:"one"}); } },1000); }, two: function(done){ jj=0; setInterval(function(){ console.log('bbb='+new Date()); jj++; if(jj>3){ clearInterval(this); done(null,{two:"two"}); } },1000); } }, function(err,rs) { console.log(err); console.log(rs); }); } exec();
2、并行无关联:async.parallel(tasks,callback);
多个函数并行执行,最后汇总结果,如果某一个流程出错就退出
async.parallel({ one: function(callback){ callback(null, 1); }, two: function(callback){ callback(null, 2); } },function(err, results) { console.log(results); });
3、串行有关联:waterfall
每一步执行时需要由上一步执行的结果当做参数.所以每一步必须串行等待
async.waterfall([ function (done) { done(null, 'one'); }, function (onearg, done) { done(null, onearg + '| two'); }, function (twoarg, done) { done(null, twoarg + '| three'); }, function (threearg, done) { done(null, threearg + '| four'); } ], function (error, result) { console.log(result); console.timeEnd('waterfall'); })
4、parallelLimit(tasks, limit, [callback])
parallelLimit函数和parallel类似,但是它多了一个参数limit。
limit参数限制任务只能同时并发一定数量,而不是无限制并发;
async.parallelLimit([ function(callback){ callback(null, 'one'); }, function(callback){ callback(null, 'two'); } ], 2, //只允许同时有两个函数并行 function(err, results){ console.log(results); });