眾所周知,nodejs異步和循環(huán)對(duì)于初學(xué)者來說是一個(gè)很大的問題,今天我們就一起來了解和解決它
當(dāng)異步和循環(huán)同時(shí)出現(xiàn)的時(shí)候這個(gè)問題就會(huì)被放大很多倍.
慶幸的是,大神們研究出了async這個(gè)第三方模塊,解決了node中異步金字塔和循環(huán)問題
async這個(gè)模塊應(yīng)該是nodejs中使用最多的第三方模塊,每個(gè)月下載量3000W+
async基礎(chǔ)使用 : //www.survivalescaperooms.com/article/118526.htm
異步嵌套循環(huán),循環(huán)嵌套異步的例子:
var async = require('async'); //初始化 var async_lists = [{ aa: 11, bb: 21 }, { aa: 31, bb: 41 }, { aa: 51, bb: 61 }, { aa: 71, bb: 81 }, { aa: 91, bb: 91 }]; var task = []; task.push(function (callback) { console.log('第一個(gè)task任務(wù)'); //循環(huán) async.eachSeries(async_lists, function (async_list, cb) { task_a(async_list, cb) }, function (err) { if (err) return callback(err); //重新賦值 async_lists = [{ aa: 12, bb: 22 }, { aa: 32, bb: 42 }, { aa: 52, bb: 62 }, { aa: 72, bb: 82 }, { aa: 92, bb: 92 }]; callback() }); }) task.push(function (callback) { console.log('第二個(gè)task任務(wù)'); async.eachSeries(async_lists, function (async_list, cb) { task_a(async_list, cb) }, function (err) { if (err) return callback(err); async_lists = [{ aa: 13, bb: 23 }, { aa: 33, bb: 43 }, { aa: 53, bb: 63 }, { aa: 73, bb: 83 }, { aa: 93, bb: 93 }]; callback() }); }) task.push(function (callback) { console.log('第三個(gè)task任務(wù)'); async.eachSeries(async_lists, function (async_list, cb) { task_a(async_list, cb) }, function (err) { if (err) return callback(err); callback() }); }) //最外層流程控制 async.waterfall(task, function (err, result) { if (err) return console.log(err); console.log('成功'); }) function task_a(async_list, cb) { var task2 = []; task2.push(function (cb) { console.log('第一次 : ', async_list); setTimeout(function () { cb() }, 1000); }) task2.push(function (cb) { console.log('第二次 : ', async_list); console.log('---------------------------'); setTimeout(function () { cb() }, 1000); }) //循環(huán)內(nèi)流程控制 async.waterfall(task2, function (err, result) { if (err) return cb(err); cb(); }) }
解釋下這個(gè)例子:
首先,最外層使用了async.waterfall這個(gè)方法控制task數(shù)組里的異步任務(wù)執(zhí)行順序,一共push了3個(gè)任務(wù)async.waterfall(task, function (err, result) {},每執(zhí)行完一次task里的任務(wù),重新對(duì)async_lists賦值;
然后,每一個(gè)task任務(wù)里都有一個(gè)同樣的循環(huán),循環(huán)async_lists這個(gè)數(shù)組里的每一個(gè)對(duì)象,使用async.eachSeries控制必須循環(huán)里所有任務(wù)執(zhí)行完畢才往下執(zhí)行;
最后,在eachSeries循環(huán)里又有一個(gè)異步task2任務(wù),這個(gè)任務(wù)分2步,分別打印了傳入進(jìn)來的async_list的值,而且每次打印都使用setTimeout暫停一秒才執(zhí)行下一個(gè)任務(wù).
預(yù)期的結(jié)果是 : 首先執(zhí)行task里的第一個(gè)任務(wù),分別打印2次async_lists這個(gè)數(shù)組里的每個(gè)對(duì)象,而且每次打印間隔一秒,然后對(duì)async_lists重新賦值,執(zhí)行task里的第二個(gè)任務(wù),重復(fù)以上操作.3次完成后打印 成功,結(jié)束任務(wù).
輸出的結(jié)果也是預(yù)期的結(jié)果.
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注