這篇文章將為大家詳細(xì)講解有關(guān)async模塊怎么在nodejs中使用,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
創(chuàng)新互聯(lián)建站于2013年創(chuàng)立,先為商河等服務(wù)建站,商河等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為商河企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。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); })
運(yùn)行結(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); })
運(yùn)行結(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方法"); })
運(yùn)行結(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方法"); })
運(yùn)行結(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方法"); })
運(yùn)行結(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方法"); })
運(yùn)行結(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運(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í)行共計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運(yùn)行結(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); });運(yùn)行結(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方法"); })運(yùn)行結(jié)果:
相當(dāng)于 var m=2; (m*2+3)*5 =35;
關(guān)于async模塊怎么在nodejs中使用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
標(biāo)題名稱:async模塊怎么在nodejs中使用-創(chuàng)新互聯(lián)
本文地址:http://weahome.cn/article/hgpdh.html