node.js中如何使用async異步控制工具,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
為企業(yè)提供成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站優(yōu)化、成都全網(wǎng)營銷推廣、競價托管、品牌運營等營銷獲客服務(wù)。創(chuàng)新互聯(lián)建站擁有網(wǎng)絡(luò)營銷運營團隊,以豐富的互聯(lián)網(wǎng)營銷經(jīng)驗助力企業(yè)精準獲客,真正落地解決中小企業(yè)營銷獲客難題,做到“讓獲客更簡單”。自創(chuàng)立至今,成功用技術(shù)實力解決了企業(yè)“網(wǎng)站建設(shè)、網(wǎng)絡(luò)品牌塑造、網(wǎng)絡(luò)營銷”三大難題,同時降低了營銷成本,提高了有效客戶轉(zhuǎn)化率,獲得了眾多企業(yè)客戶的高度認可!這兩個操作中,第一個異步的程序我們可能會寫成這樣:
db.select(SQL1, function(res1){ db.delete(SQL2, function(res2){ db.insert(SQL3, function(res3){ // ... }) }) });
將后面的操作寫到執(zhí)行成功后的回調(diào)函數(shù)里。第2個并行的異步操作,可以使用計數(shù)器的方法,每個異步調(diào)用成功時,計數(shù)器加1,當所有的異步都調(diào)用成功后,再接著執(zhí)行:
var count = 0; var success = function(){ count++; if(count>=3){ console.log('執(zhí)行完畢...'); } } var select = function(){ db.select(sql, function(res){ success(); }) } var select2 = function(){ db.select(sql, function(res){ success(); }) } var select3 = function(){ db.select(sql, function(res){ success(); }) } select(); select2(); select3();
這些編寫方式非常麻煩,而且代碼邏輯比較混亂,調(diào)試起來也很不方便。那么就要用到異步控制的利器async了。
介紹
async的作用是進行流程的控制,而且提供了非常多的方法可供調(diào)用。
這些方法可以分為三大類:
集合類(Collections)
流程控制類(Control Flow)
工具類(Utils)
下面我們從這三個分類里分別挑出幾個方法進行講解。
二、函數(shù)介紹
async中提供了非常多的方法可供使用,我們僅僅是講解其中幾個比較有代表性的,其他的可以訪問官方文檔:http://caolan.github.io/async/docs.html。
2.1 集合類
集合類中的方法主要有some, ‘map', ‘each', ‘every'等,這些方法是對數(shù)組或組合進行某個相同的操作后,統(tǒng)一執(zhí)行回調(diào)函數(shù)。
我們以map為例,map對集合中的每一個元素,執(zhí)行某個相同的異步操作,得到結(jié)果。所有的結(jié)果將匯總到最終的callback里。
使用方法,map接收三個參數(shù),分別是:
參數(shù)名稱 | 類型 | 說明 |
coll | iteratee | callback |
Array | Iterable | Object | function | function |
需要處理數(shù)組,集合或其他可迭代的類型 | 迭代方法,用來對集合中的每一項進行處理。該方法接收兩個參數(shù)(item, callback);item為集合中的每一項, callback為回調(diào)函數(shù)。callback需要帶有err(有時可能為null)和處理后的數(shù)據(jù),callback(err, data) | 最終回調(diào)函數(shù),當集合處理完畢后調(diào)用此函數(shù),傳遞兩個參數(shù)err和result,result為之前處理后的所有的結(jié)果的集合 |
注意:中間處理函數(shù)iteratee對coll中的每一項都是并發(fā)處理的,因此并不能保證iteratee按照順序完成。不過,如果coll是個數(shù)組,最后的結(jié)果集results會按照coll中的順序排列;如果coll是個集合(Object)類型,results會是數(shù)組類型,結(jié)果將大致按照coll的鍵的順序排列(但是不同在不同的JavaScript引擎中會有可能發(fā)生變化)。
我們來舉個例子,使用map獲取幾個文件中的內(nèi)容:
var files = ['./file/cnode_1.txt', './file/cnode_2.txt', './file/cnode_3.txt']; // 讀取文件內(nèi)容 // 第1個參數(shù) 文件名稱列表的數(shù)組 // 第2個參數(shù) 傳入數(shù)組中的每一項和回調(diào)函數(shù) // 第3個參數(shù) results為所有結(jié)果的集合 async.map(files, function(file, cb){ fs.readFile(file, 'utf-8', function(err, data){ cb(err, data); }) }, function(err, results){ console.log( results ); })
而且,如果中間的處理函數(shù)比較大,不想寫在map中,也可以單獨寫成一個函數(shù),然后傳遞進去,不過參數(shù)傳遞還是要符合規(guī)則的:
var files = ['./file/cnode_1.txt', './file/cnode_2.txt', './file/cnode_3.txt']; var read = function(file, cb){ fs.readFile(file, 'utf-8', function(err, data){ cb(err, data); }) } async.map(files, read, function(err, result){ console.log( result ); })
這里還有一個mapLimit,可以傳遞一個參數(shù)limit,用來限制并發(fā)的數(shù)量:mapLimit(coll, limit, iteratee, callbackopt)
:
// 并發(fā)數(shù)量為2 async.mapLimit(files, 2, read, function(err, result){ console.log( result ); })
同時,集合類中還有其他的方法,我們也稍微了解下:
each : 與map類似,但是最后的回調(diào)函數(shù)里沒有results,each只循環(huán)不負責處理結(jié)果
every : 中間處理函數(shù)iteratee的參數(shù)(err, boolean)需要傳遞一個boolean值,若所有選項的結(jié)果都為true,則results為true
some : 與every類似,只是只要其中一個選項的結(jié)果為true,則results為true
filter : 對coll進行篩選,篩選出結(jié)果為true的結(jié)果
reject : 與filter正好相反,篩選出結(jié)果為false的結(jié)果
concat : 將每個異步操作的結(jié)果合并為一個數(shù)組
2.2 流程控制類
上面的集合類是對一個集合進行相同的處理,集合中的每一項都處理完后,再對結(jié)果進行回調(diào)處理。而多個回調(diào)方法執(zhí)行時,則需要對這幾個回調(diào)方法進行控制了。
多個回調(diào)方法執(zhí)行時,通常有這么幾個流程:
串行且無關(guān)聯(lián),即執(zhí)行完一個后再依次執(zhí)行下一個,且相互之間無數(shù)據(jù)交互,都執(zhí)行完后,再執(zhí)行最后的回調(diào)函數(shù)??梢允褂?code>async.series
串行且有關(guān)聯(lián),即執(zhí)行完一個后再依次執(zhí)行下一個,且上一個回調(diào)函數(shù)的結(jié)果會作為下一個回調(diào)函數(shù)的參數(shù)??梢允褂胊sync.waterfall
并行,這幾個回調(diào)函數(shù)同時并發(fā)執(zhí)行,都執(zhí)行完成后,再執(zhí)行最后的回調(diào)函數(shù)??梢允褂?code>async.parallel
當然還有其他更復(fù)雜的流程,這里也只聊上面的三種情況。
async.series,async.waterfall和async.parallel的語法都是一樣的: async.Method(coll, function(err, results){ })
其中coll既可以是數(shù)組,也可以是json格式的,而且results的類型與coll對應(yīng)。
串行且無關(guān)聯(lián)async.series
:
// 串行且無關(guān)聯(lián),數(shù)組格式 async.series([ function(cb){ getAllList(function(result){ cb(null, result); }); }, function(cb){ getAllUser(function(result){ cb(null, result); }); } ], function(err, result){ console.log(result); })
同時串行的異步可以是json格式的:
// 串行且無關(guān)聯(lián),json個數(shù) async.series({ one: function(cb){ getAllList(function(result){ cb(null, result); }); }, two: function(cb){ getAllUser(function(result){ cb(null, result); }); } }, function(err, result){ console.log(result); })
串行且有關(guān)聯(lián)async.waterfall
:
// 串行且上一個結(jié)果作為下一個的參數(shù) async.waterfall([ function(cb){ getListById(1, function(result){ cb(null, result); }); }, function(params, cb){ console.log(params); getAllUser(function(result){ cb(null, result); }); } ], function(err, result){ console.log(result); })
并行async.parallel
:
// 并行,getAllList與getAllUser同時執(zhí)行 async.parallel([ function(cb){ getAllList(function(result){ cb(null, result); }); }, function(cb){ getAllUser(function(result){ cb(null, result); }); } ], function(err, result){ console.log(result); })
關(guān)于并行的異步操作,這里還有一個async.parallelLimit
,限制并發(fā)的數(shù)量:
// 并發(fā)數(shù)量為2 async.parallelLimit([ iteratee1, iteratee2, iteratee3, ... ], 2, function(err, results){ })
2.3 工具類
async中也提供了不少的工具方法可供使用,比如async.log可以輸出回調(diào)方法中的值,第1個參數(shù)為函數(shù),后面的參數(shù)為傳遞給函數(shù)的參數(shù):
var hello = function(name, callback) { setTimeout(function() { callback(null, 'hello ' + name); }, 1000); }; // 將'world'傳遞給hello方法 async.log(hello, 'world'); // 'hello world'
這里面還有apply, dir, timeout等方法。
關(guān)于node.js中如何使用async異步控制工具問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道了解更多相關(guān)知識。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站m.rwnh.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
新聞標題:node.js中如何使用async異步控制工具-創(chuàng)新互聯(lián)
文章出自:http://m.rwnh.cn/article16/djijdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、移動網(wǎng)站建設(shè)、手機網(wǎng)站建設(shè)、網(wǎng)站營銷、網(wǎng)站導(dǎo)航、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容