nodejs中解決異步嵌套循環(huán)和循環(huán)嵌套異步的問題
眾所周知,nodejs異步和循環(huán)對于初學者來說是一個很大的問題,今天我們就一起來了解和解決它
當異步和循環(huán)同時出現(xiàn)的時候這個問題就會被放大很多倍.
慶幸的是,大神們研究出了async這個第三方模塊,解決了node中異步金字塔和循環(huán)問題
async這個模塊應該是nodejs中使用最多的第三方模塊,每個月下載量3000W+

async基礎使用 : http://www.dhdzp.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('第一個task任務');
//循環(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('第二個task任務');
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('第三個task任務');
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();
})
}
解釋下這個例子:
首先,最外層使用了async.waterfall這個方法控制task數(shù)組里的異步任務執(zhí)行順序,一共push了3個任務async.waterfall(task, function (err, result) {},每執(zhí)行完一次task里的任務,重新對async_lists賦值;
然后,每一個task任務里都有一個同樣的循環(huán),循環(huán)async_lists這個數(shù)組里的每一個對象,使用async.eachSeries控制必須循環(huán)里所有任務執(zhí)行完畢才往下執(zhí)行;
最后,在eachSeries循環(huán)里又有一個異步task2任務,這個任務分2步,分別打印了傳入進來的async_list的值,而且每次打印都使用setTimeout暫停一秒才執(zhí)行下一個任務.
預期的結果是 : 首先執(zhí)行task里的第一個任務,分別打印2次async_lists這個數(shù)組里的每個對象,而且每次打印間隔一秒,然后對async_lists重新賦值,執(zhí)行task里的第二個任務,重復以上操作.3次完成后打印 成功,結束任務.


輸出的結果也是預期的結果.
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Node.js?連接?MySql?統(tǒng)計組件屬性的使用情況解析
這篇文章主要為大家介紹了Node.js?連接?MySql?統(tǒng)計組件屬性的使用情況解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
在node環(huán)境下parse Smarty模板的使用示例代碼
這篇文章主要介紹了在node環(huán)境下parse Smarty模板的使用示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11
node.js中stream流中可讀流和可寫流的實現(xiàn)與使用方法實例分析
這篇文章主要介紹了node.js中stream流中可讀流和可寫流的實現(xiàn)與使用方法,結合實例形式分析了node.js stream流可讀流和可寫流基本分類、原理、定義、使用方法及相關注意事項,需要的朋友可以參考下2020-02-02
nodejs對mongodb數(shù)據(jù)庫的增加修刪該查實例代碼
在本篇文章里小編給大家整理的是一篇關于nodejs對mongodb數(shù)據(jù)庫的增加修刪該查實例代碼,有需要的朋友們可以參考下。2020-01-01
使用Node.js創(chuàng)建一個簡單的HTTP服務器的示例代碼
Node.js 是一種強大的 JavaScript 運行環(huán)境,允許開發(fā)者在服務器端運行 JavaScript 代碼,它以異步事件驅(qū)動的方式處理大量連接,適合構建高效的網(wǎng)絡應用程序,在這篇文章中,我們將一起學習如何使用 Node.js 創(chuàng)建一個簡單的 HTTP 服務器,并通過示例代碼幫你快速上手2025-02-02

