亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

深入學習nodejs中的async模塊的使用方法

2019-11-19 16:05:49
字體:
來源:轉載
供稿:網友

最近在學習nodejs,這兩天學習了async模塊這個地方知識點挺多的,所以,今天添加一點小筆記。

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

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

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

運行結果:

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

運行結果:

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

運行結果:

4.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執行完畢.

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

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

相當于while循環,fn函數里不管是同步還是異步都會執行完上一次循環才會執行下一次循環,對異步循環很有幫助,
test是條件,為true時執行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結束'); }); 

運行結果:

7.doWhilst

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

until和whilst相反,當test判斷為false的時候執行fn里的方法,為true時跳出,

doUntil與doWhilst相反.

8.forever(fn,errback)

forever就是無限循環了.只有當中途出現錯誤的時候才會停止

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

運行結果:

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

這個方法會創建一個異步的集合函數,執行的順序是倒序.前一個fn的輸出是后一個fn的輸入.有數據交互

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

運行結果:

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

在我的項目開發中waterfall用的最多.

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品91在线| 中文字幕v亚洲ⅴv天堂| 成人黄色免费网站在线观看| 精品亚洲国产成av人片传媒| 精品一区二区三区电影| 91人成网站www| 国产精品一区二区三区成人| 精品国内亚洲在观看18黄| 久久综合国产精品台湾中文娱乐网| 久久亚洲电影天堂| 日韩视频免费看| 丝袜亚洲欧美日韩综合| 欧美激情在线观看视频| 国产成人jvid在线播放| 按摩亚洲人久久| 色综合天天狠天天透天天伊人| 日本三级韩国三级久久| 精品国产91久久久| 国产精品视频导航| 亚洲欧洲黄色网| 精品一区二区三区三区| 国产98色在线| 88国产精品欧美一区二区三区| 91九色精品视频| 成人福利视频网| 国外成人在线播放| 欧美国产精品日韩| 91在线观看免费高清完整版在线观看| 久久精品中文字幕免费mv| 色综合久久久久久中文网| 国内精品小视频在线观看| 精品欧美国产一区二区三区| 91超碰中文字幕久久精品| 精品久久香蕉国产线看观看gif| 亚洲第一精品电影| 岛国av一区二区在线在线观看| 亚洲a在线播放| 中文字幕欧美日韩在线| 国产精品私拍pans大尺度在线| 国产ts人妖一区二区三区| 欧美电影在线免费观看网站| 亚洲精品v欧美精品v日韩精品| 久久夜色撩人精品| 国产精品久久久久久久久久ktv| 黑人极品videos精品欧美裸| 欧美一级视频免费在线观看| 91日本视频在线| 欧美乱大交xxxxx另类电影| 国产成人精品一区二区在线| 欧美亚洲成人免费| 国产精品视频26uuu| 久久久国产精品亚洲一区| 精品视频在线播放色网色视频| 一区二区日韩精品| 米奇精品一区二区三区在线观看| 亚洲成年人在线| 欧美在线免费观看| 国产狼人综合免费视频| 日韩av在线一区| 美女999久久久精品视频| 欧美在线视频播放| 欧美人交a欧美精品| 国产精品久久9| 欧洲日韩成人av| 日韩欧美大尺度| 91欧美精品午夜性色福利在线| 欧美成人精品xxx| 欧美电影免费播放| 久久视频在线免费观看| 久久国产精品电影| 91免费精品国偷自产在线| 亚洲毛茸茸少妇高潮呻吟| 国产美女搞久久| 国产日韩欧美在线看| 在线视频日本亚洲性| 性视频1819p久久| 亚洲精品久久久久久久久久久| 久久亚洲精品国产亚洲老地址| 精品久久久久久国产91| 日韩av在线天堂网| 色青青草原桃花久久综合| 日本韩国欧美精品大片卡二| 国产美女精品免费电影| 亚洲国产日韩欧美在线图片| 亚洲xxxxx性| 欧美成人网在线| 在线国产精品视频| 欧美激情欧美狂野欧美精品| 北条麻妃一区二区在线观看| 91久久精品久久国产性色也91| 国产日韩欧美在线| 欧洲成人午夜免费大片| 亚洲精品美女久久| 日韩av理论片| 亚洲欧美一区二区精品久久久| 色偷偷噜噜噜亚洲男人的天堂| 91丨九色丨国产在线| 久久久久久久色| 久久免费视频网| 国产亚洲人成a一在线v站| 久久理论片午夜琪琪电影网| 国产精品成久久久久三级| 国内精品免费午夜毛片| 久久99国产精品自在自在app| 国产精品黄页免费高清在线观看| 欧美精品一区在线播放| 色婷婷综合久久久久| 国产精品久久久久aaaa九色| 亚洲成人1234| 欧美理论电影在线观看| 成人精品久久久| 国产成人综合久久| 欧美在线视频播放| 黄色精品一区二区| 久久99精品国产99久久6尤物| 国产精品日日摸夜夜添夜夜av| 亚洲精品美女在线观看播放| 欧美一级免费看| 精品二区三区线观看| 这里只有精品视频| 国产啪精品视频网站| 成人有码在线视频| 亚洲欧美中文日韩v在线观看| 日本免费在线精品| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲人成自拍网站| 欧美在线一级va免费观看| 欧美裸体男粗大视频在线观看| 日韩最新免费不卡| 亚洲wwwav| 国产精品第3页| 97婷婷涩涩精品一区| 欧美日韩在线观看视频| 欧美日韩999| 国产精品旅馆在线| 亚洲午夜未满十八勿入免费观看全集| 欧美成人一区二区三区电影| 久久成人免费视频| 伊人久久免费视频| 亚洲国产精品成人一区二区| 最新亚洲国产精品| 中文字幕日韩欧美在线| 一本色道久久综合狠狠躁篇的优点| 日韩av电影在线网| 91在线观看免费观看| 国产在线拍偷自揄拍精品| 66m—66摸成人免费视频| 亚洲va电影大全| 日本久久久久久久久| 91香蕉嫩草神马影院在线观看| 欧美日韩国产在线看| 亚洲国产精品国自产拍av秋霞| 在线性视频日韩欧美| 九九热这里只有在线精品视| 国产一区二区在线免费| 久久影院中文字幕| 欧美成人三级视频网站| 国产精品久久久久久av下载红粉| 97在线视频免费播放| 国产免费一区二区三区在线能观看| 久久久噜久噜久久综合| 久久精品最新地址| 欧美日韩国产限制| 亚洲毛片一区二区|