多语言展示
当前在线:610今日阅读:165今日分享:48

nodejs异步流程控制async模块使用

nodejs绝大部分代码都是异步的,而async模块就是为了解决嵌套金字塔,和异步流程控制而生;使用async模块后,代码看起来优雅很多.看起来想同步,其实底层还是异步的.只是书写的方式变了而已.
工具/原料
1

nodejs

2

npm

3

async模块

方法/步骤
1

npm下载async模块npm install async

2

---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);  })运行结果:

3

如果中途发生错误,则将错误传递到回调函数,并停止执行后面的函数代码: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);  })  运行结果:

4

---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就执行完毕.

5

如果中途出错,则立即将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方法');  })运行结果:

6

---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方法');  })  运行结果:

7

如果中途出现错误,后面的函数将不在执行,之前执行的结果和错误信息将直接传到最终的回调函数代码: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方法');  }) 运行结果:

8

---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执行完毕.

9

---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秒.

注意事项
1

async模块版本为1.5+

2

本经验为作者原创写作经验中的实际经验分享

4

如果您觉得对你有帮助,请投我一票,谢谢!

推荐信息