nodejs
npm
async模块
npm下载async模块npm install async
---series(tasks,[callback])多个函数从上到下依次执行,相互之间没有数据交互代码:var task1 =function(callback){ console.log('task1'); callback(null,'task1') } var task2 =function(callback){ console.log('task2'); callback(null,'task2') } var task3 =function(callback){ console.log('task3'); callback(null,'task3') } async.series([task1,task2,task3],function(err,result){ console.log('series'); if (err) { console.log(err); } console.log(result); })运行结果:
如果中途发生错误,则将错误传递到回调函数,并停止执行后面的函数代码:var task1 =function(callback){ console.log('task1'); callback(null,'task1') } var task2 =function(callback){ console.log('task2'); callback('err','task2') } var task3 =function(callback){ console.log('task3'); callback(null,'task3') } async.series([task1,task2,task3],function(err,result){ console.log('series'); if (err) { console.log(err); } console.log(result); }) 运行结果:
---parallel(tasks,[callback])多个函数并行执行,不会等待其他函数代码:var task1 =function(callback){ console.log('task1'); setTimeout(function(){ callback(null,'task1') },5000); } var task2 =function(callback){ console.log('task2'); setTimeout(function(){ callback(null,'task2') },1000); } var task3 =function(callback){ console.log('task3'); setTimeout(function(){ callback(null,'task3') },3000); } console.time('parallel方法'); async.parallel([task1,task2,task3],function(err,result){ console.log('parallel'); if (err) { console.log(err); } console.log(result); console.timeEnd('parallel方法'); }) 运行结果:3个函数分别延迟5000ms,1000ms,3000ms 结果5000ms就执行完毕.
如果中途出错,则立即将err和值传到最终的回调函数,其他未执行完毕的函数将不再执行,但是要占一个位置代码:var task1 =function(callback){ console.log('task1'); setTimeout(function(){ callback(null,'task1') },5000); } var task2 =function(callback){ console.log('task2'); setTimeout(function(){ callback('errmessage','task2') },3000); } var task3 =function(callback){ console.log('task3'); setTimeout(function(){ callback(null,'task3') },1000); } console.time('parallel方法'); async.parallel([task1,task2,task3],function(err,result){ console.log('parallel'); if (err) { console.log(err); } console.log(result); console.timeEnd('parallel方法'); })运行结果:
---waterfall(tasks,[callback]) :瀑布流依次执行,前一个函数的输出为后一个函数的输入代码:var task1 =function(callback){ console.log('task1'); callback(null,'11') } var task2 =function(q,callback){ console.log('task2'); console.log('task1函数传入的值: '+q); callback(null,'22') } var task3 =function(q,callback){ console.log('task3'); console.log('task2函数传入的值: '+q); callback(null,'33') } console.time('waterfall方法'); async.waterfall([task1,task2,task3],function(err,result){ console.log('waterfall'); if (err) { console.log(err); } console.log('result : '+result); console.timeEnd('waterfall方法'); }) 运行结果:
如果中途出现错误,后面的函数将不在执行,之前执行的结果和错误信息将直接传到最终的回调函数代码:var task1 =function(callback){ console.log('task1'); callback(null,'11') } var task2 =function(q,callback){ console.log('task2'); console.log('task1函数传入的值: '+q); callback('errmessage','22') } var task3 =function(q,callback){ console.log('task3'); console.log('task2函数传入的值: '+q); callback(null,'33') } console.time('waterfall方法'); async.waterfall([task1,task2,task3],function(err,result){ console.log('waterfall'); if (err) { console.log(err); } console.log('result : '+result); console.timeEnd('waterfall方法'); }) 运行结果:
---parallelLimit(tasks,limit,[callback]) 和parallel类似,只是limit参数限制了同时并发执行的个数,不再是无限并发代码:var task1 =function(callback){ console.log('task1'); setTimeout(function(){ callback(null,'task1') },5000); } var task2 =function(callback){ console.log('task2'); setTimeout(function(){ callback(null,'task2') },3000); } var task3 =function(callback){ console.log('task3'); setTimeout(function(){ callback(null,'task3') },4000); } console.time('parallelLimit方法'); async.parallelLimit([task1,task2,task3], 2, function(err,result){ console.log('parallelLimit'); if (err) { console.log(err); } console.log(result); console.timeEnd('parallelLimit方法'); }) 运行结果:三个函数分别是延迟5000ms,3000ms,4000ms结果执行时间为什么是7000ms呢因为首先执行函数1和2,3秒后函数2执行完毕,这个时候函数3开始执行,5秒后函数1执行完毕,函数3还有2秒,7秒后函数3执行完毕.
---auto(tasks,[callback]) 多个函数有数据交互,有的并行,有的依次执行代码:console.time('auto方法'); async.auto({ task1: function(callback){ console.log('tsak1'); setTimeout(function(){ callback(null, 'task11', 'task12'); },2000); }, task2: function(callback){ console.log('task2'); setTimeout(function(){ callback(null, 'task2'); },3000); }, task3: ['task1', 'task2', function(callback, results){ console.log('task3'); console.log('task1和task2运行结果: ',results); setTimeout(function(){ callback(null, 'task3'); },1000); }], task4: ['task3', function(callback, results){ console.log('task4'); console.log('task1,task2,task3运行结果: ',results); setTimeout(function(){ callback(null, {'task41':results.task3, 'task42':'task42'}); },1000); }] }, function(err, results) { console.log('err :', err); console.log('最终results : ', results); console.timeEnd('auto方法'); }); 运行结果:5秒运行完毕,函数1和2并行,3秒执行完毕,函数1和2执行完毕后,函数3,4依次执行共计5秒.
async模块版本为1.5+
本经验为作者原创写作经验中的实际经验分享
如果您觉得对你有帮助,请投我一票,谢谢!