国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

深入學(xué)習(xí)nodejs中的async模塊的使用方法

2019-11-19 16:05:49
字體:
供稿:網(wǎng)友

最近在學(xué)習(xí)nodejs,這兩天學(xué)習(xí)了async模塊這個(gè)地方知識點(diǎn)挺多的,所以,今天添加一點(diǎn)小筆記。

async模塊是為了解決嵌套金字塔,和異步流程控制而生.常用的方法介紹

npm 安裝好async模塊,然后引入就可以使用 var async = require('async');

1. series(tasks,[callback])

多個(gè)函數(shù)從上到下依次執(zhí)行,相互之間沒有數(shù)據(jù)交互

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); }) 

運(yùn)行結(jié)果:

如果中途發(fā)生錯(cuò)誤,則將錯(cuò)誤傳遞到回調(diào)函數(shù),并停止執(zhí)行后面的函數(shù)

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); }) 

運(yùn)行結(jié)果:

2.parallel(tasks,[callback])

多個(gè)函數(shù)并行執(zhí)行,不會等待其他函數(shù)

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方法"); }) 

運(yùn)行結(jié)果:

3個(gè)函數(shù)分別延遲5000ms,1000ms,3000ms 結(jié)果5000ms就執(zhí)行完畢.

如果中途出錯(cuò),則立即將err和值傳到最終的回調(diào)函數(shù),其他未執(zhí)行完畢的函數(shù)將不再執(zhí)行,但是要占一個(gè)位置

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方法"); }) 

運(yùn)行結(jié)果:

3.waterfall(tasks,[callback]) :瀑布流

依次執(zhí)行,前一個(gè)函數(shù)的輸出為后一個(gè)函數(shù)的輸入

var task1 =function(callback){   console.log("task1");  callback(null,"11")  }  var task2 =function(q,callback){   console.log("task2");  console.log("task1函數(shù)傳入的值: "+q);  callback(null,"22") }  var task3 =function(q,callback){   console.log("task3");  console.log("task2函數(shù)傳入的值: "+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方法"); }) 

執(zhí)行結(jié)果:

 

如果中途出現(xiàn)錯(cuò)誤,后面的函數(shù)將不在執(zhí)行,之前執(zhí)行的結(jié)果和錯(cuò)誤信息將直接傳到最終的回調(diào)函數(shù)

var task1 =function(callback){   console.log("task1");  callback(null,"11")  }  var task2 =function(q,callback){   console.log("task2");  console.log("task1函數(shù)傳入的值: "+q);  callback("errmessage","22") }  var task3 =function(q,callback){   console.log("task3");  console.log("task2函數(shù)傳入的值: "+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方法"); }) 

運(yùn)行結(jié)果:

4.parallelLimit(tasks,limit,[callback])

和parallel類似,只是limit參數(shù)限制了同時(shí)并發(fā)執(zhí)行的個(gè)數(shù),不再是無限并發(fā)

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方法"); }) 

運(yùn)行結(jié)果:

三個(gè)函數(shù)分別是延遲5000ms,3000ms,4000ms結(jié)果執(zhí)行時(shí)間為什么是7000ms呢

因?yàn)槭紫葓?zhí)行函數(shù)1和2,

3秒后函數(shù)2執(zhí)行完畢,這個(gè)時(shí)候函數(shù)3開始執(zhí)行,

5秒后函數(shù)1執(zhí)行完畢,函數(shù)3還有2秒,

7秒后函數(shù)3執(zhí)行完畢.

5.auto(tasks,[callback])

多個(gè)函數(shù)有數(shù)據(jù)交互,有的并行,有的依次執(zhí)行

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運(yùn)行結(jié)果: ',results);  setTimeout(function(){   callback(null, 'task3');  },1000);  }],  task4: ['task3', function(callback, results){  console.log('task4');  console.log('task1,task2,task3運(yùn)行結(jié)果: ',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方法"); }); 

運(yùn)行結(jié)果:

5秒運(yùn)行完畢,

函數(shù)1和2并行,3秒執(zhí)行完畢,

函數(shù)1和2執(zhí)行完畢后,函數(shù)3,4依次執(zhí)行共計(jì)5秒.

6.whilst(test,fn,[callback])

相當(dāng)于while循環(huán),fn函數(shù)里不管是同步還是異步都會執(zhí)行完上一次循環(huán)才會執(zhí)行下一次循環(huán),對異步循環(huán)很有幫助,
test是條件,為true時(shí)執(zhí)行fn里的方法

var datalist = [{number:10},{number:20},{number:30},{number:40},{number:50}]; var count = 0;  var test = function () {  return count<datalist.length; };  var fn = function(callback){  console.log(datalist[count].number);  setTimeout(function () {  count++;  callback();  },1000) };  async.whilst(test,fn,function(err){  if(err){  console.log(err);  }  console.log('whilst結(jié)束'); }); 

運(yùn)行結(jié)果:

7.doWhilst

和whilst類似,和do-while一個(gè)意思,首先執(zhí)行一次fn,再判斷,和whilst相比它把fn和test位置交換了而已.

until和whilst相反,當(dāng)test判斷為false的時(shí)候執(zhí)行fn里的方法,為true時(shí)跳出,

doUntil與doWhilst相反.

8.forever(fn,errback)

forever就是無限循環(huán)了.只有當(dāng)中途出現(xiàn)錯(cuò)誤的時(shí)候才會停止

var count = 0; async.forever(function(callback){  console.log(count);  count++;   if (count>10) {  callback("errmessage");  return;  }   setTimeout(function () {  callback();  },1000) }, function(err){  console.log(err); }); 

運(yùn)行結(jié)果:

9.compose(fn1,fn2,fn3...)

這個(gè)方法會創(chuàng)建一個(gè)異步的集合函數(shù),執(zhí)行的順序是倒序.前一個(gè)fn的輸出是后一個(gè)fn的輸入.有數(shù)據(jù)交互

var task1 =function(m,callback){   console.log("task1");  setTimeout(function(){  callback(null,m*2)  },1000);  }  var task2 =function(m,callback){   console.log("task2");   setTimeout(function(){  callback(null,m+3)  },1000); }  var task3 =function(m,callback){   console.log("task3");  setTimeout(function(){  callback(null,m*5)  },1000); } console.time("compose方法");  var com = async.compose(task3,task2,task1);  com(2,function(err,result){  if (err) {  console.log(err);  }  console.log(result);  console.timeEnd("compose方法"); }) 

運(yùn)行結(jié)果:

相當(dāng)于 var m=2; (m*2+3)*5 =35;

在我的項(xiàng)目開發(fā)中waterfall用的最多.

更多方法詳情 : https://www.npmjs.com/package/async

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 盈江县| 新郑市| 德清县| 宜阳县| 隆尧县| 潞西市| 潮安县| 霍州市| 长泰县| 肥乡县| 济南市| 浦江县| 习水县| 兴仁县| 宁国市| 彭水| 海兴县| 扎鲁特旗| 嵊州市| 固安县| 阿图什市| 鄂尔多斯市| 鞍山市| 新龙县| 确山县| 吐鲁番市| 富川| 合川市| 祁门县| 阿坝县| 昭觉县| 平原县| 定远县| 罗源县| 永修县| 深州市| 大理市| 全椒县| 来宾市| 陵水| 宁化县|