欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2017年07月12日 15:48:38   作者:意外金喜  
本篇文章主要介紹了nodejs中的async模塊的使用方法,具有一定的參考價值,有興趣的可以了解一下

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

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

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

1. series(tasks,[callback])

多個函數(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); 
}) 

運行結(jié)果:

如果中途發(fā)生錯誤,則將錯誤傳遞到回調(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); 
}) 

運行結(jié)果:

2.parallel(tasks,[callback])

多個函數(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方法"); 
}) 

運行結(jié)果:

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

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

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

運行結(jié)果:

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

依次執(zhí)行,前一個函數(shù)的輸出為后一個函數(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)錯誤,后面的函數(shù)將不在執(zhí)行,之前執(zhí)行的結(jié)果和錯誤信息將直接傳到最終的回調(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方法"); 
}) 

運行結(jié)果:

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

和parallel類似,只是limit參數(shù)限制了同時并發(fā)執(zhí)行的個數(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方法"); 
}) 

運行結(jié)果:

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

因為首先執(zhí)行函數(shù)1和2,

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

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

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

5.auto(tasks,[callback])

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

運行結(jié)果:

5秒運行完畢,

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

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

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

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

運行結(jié)果:

7.doWhilst

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

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

doUntil與doWhilst相反.

8.forever(fn,errback)

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

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

運行結(jié)果:

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

這個方法會創(chuàng)建一個異步的集合函數(shù),執(zhí)行的順序是倒序.前一個fn的輸出是后一個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方法"); 
}) 

運行結(jié)果:

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

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

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

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

相關(guān)文章

  • 使用nodejs、Python寫的一個簡易HTTP靜態(tài)文件服務(wù)器

    使用nodejs、Python寫的一個簡易HTTP靜態(tài)文件服務(wù)器

    這篇文章主要介紹了使用nodejs、Python寫的一個簡易HTTP靜態(tài)文件服務(wù)器,分為nodejs和Python兩個版本,用類似淘寶的CSS、JS文件加載方式處理靜態(tài)文件加載,需要的朋友可以參考下
    2014-07-07
  • Node.js查詢MySQL并返回結(jié)果集給客戶端的全過程

    Node.js查詢MySQL并返回結(jié)果集給客戶端的全過程

    nodejs最大的優(yōu)勢也是大家用著最為難以理解的一點,就是它的異步功能,它幾乎所有的io操作都是異步的,這也就導(dǎo)致很多人不理解也用不習(xí)慣,下面這篇文章主要給大家介紹了關(guān)于Node.js查詢MySQL并返回結(jié)果集給客戶端的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • 淺析Node.js中的內(nèi)存泄漏問題

    淺析Node.js中的內(nèi)存泄漏問題

    這篇文章主要介紹了淺析Node.js中的內(nèi)存泄漏問題,Node.js是使JavaScript應(yīng)用在服務(wù)器端運行的一款框架,需要的朋友可以參考下
    2015-06-06
  • Node.js API詳解之 string_decoder用法實例分析

    Node.js API詳解之 string_decoder用法實例分析

    這篇文章主要介紹了Node.js API詳解之 string_decoder用法,結(jié)合實例形式分析了Node.js API中string_decoder的功能、用法及操作注意事項,需要的朋友可以參考下
    2020-04-04
  • Node.JS中事件輪詢(Event Loop)的解析

    Node.JS中事件輪詢(Event Loop)的解析

    對NodeJs的事情輪詢機造一孔之見。查閱了些許材料后,總算掀開了其神奇的里紗。下面這篇文章主要介紹了Node.JS中事件輪詢(Event Loop)的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • 了不起的node.js讀書筆記之例程分析

    了不起的node.js讀書筆記之例程分析

    這篇文章主要介紹了了不起的node.js讀書筆記之例程分析,需要的朋友可以參考下
    2014-12-12
  • node.js中path路徑模塊的使用方法實例分析

    node.js中path路徑模塊的使用方法實例分析

    這篇文章主要介紹了node.js中path路徑模塊的使用方法,結(jié)合實例形式分析了node.js path路徑模塊的基本功能、原理、使用方法及操作注意事項,需要的朋友可以參考下
    2020-02-02
  • nodejs實現(xiàn)的http、https 請求封裝操作示例

    nodejs實現(xiàn)的http、https 請求封裝操作示例

    這篇文章主要介紹了nodejs實現(xiàn)的http、https 請求封裝操作,結(jié)合實例形式分析了node.js針對http、https 請求的封裝與使用相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • 基于nodejs+express(4.x+)實現(xiàn)文件上傳功能

    基于nodejs+express(4.x+)實現(xiàn)文件上傳功能

    通過一段時間的查閱資料發(fā)現(xiàn)實現(xiàn)上傳的方式有:1.express中間件multer模塊2.connect-multiparty模塊(但現(xiàn)在 官方不推薦 )3.使用multiparty模塊實現(xiàn)4.使用formidable插件實現(xiàn),本文給大家介紹nodejs+express(4.x+)實現(xiàn)文件上傳功能,需要的朋友參考下
    2015-11-11
  • 詳解從NodeJS搭建中間層再談前后端分離

    詳解從NodeJS搭建中間層再談前后端分離

    這篇文章主要介紹了詳解從NodeJS搭建中間層再談前后端分離,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11

最新評論