溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nodejs中解決異步嵌套循環和循環嵌套異步的問題

發布時間:2020-10-12 22:45:04 來源:腳本之家 閱讀:271 作者:意外金喜 欄目:web開發

眾所周知,nodejs異步和循環對于初學者來說是一個很大的問題,今天我們就一起來了解和解決它

當異步和循環同時出現的時候這個問題就會被放大很多倍.

慶幸的是,大神們研究出了async這個第三方模塊,解決了node中異步金字塔和循環問題

async這個模塊應該是nodejs中使用最多的第三方模塊,每個月下載量3000W+

nodejs中解決異步嵌套循環和循環嵌套異步的問題

async基礎使用 : https://www.jb51.net/article/118526.htm

異步嵌套循環,循環嵌套異步的例子:

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任務'); 
 //循環 
 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); 
 }) 
 //循環內流程控制 
 async.waterfall(task2, function (err, result) { 
  if (err) return cb(err); 
  cb(); 
 }) 
} 

解釋下這個例子:
首先,最外層使用了async.waterfall這個方法控制task數組里的異步任務執行順序,一共push了3個任務async.waterfall(task, function (err, result) {},每執行完一次task里的任務,重新對async_lists賦值;

然后,每一個task任務里都有一個同樣的循環,循環async_lists這個數組里的每一個對象,使用async.eachSeries控制必須循環里所有任務執行完畢才往下執行;

最后,在eachSeries循環里又有一個異步task2任務,這個任務分2步,分別打印了傳入進來的async_list的值,而且每次打印都使用setTimeout暫停一秒才執行下一個任務.

預期的結果是 : 首先執行task里的第一個任務,分別打印2次async_lists這個數組里的每個對象,而且每次打印間隔一秒,然后對async_lists重新賦值,執行task里的第二個任務,重復以上操作.3次完成后打印 成功,結束任務.

nodejs中解決異步嵌套循環和循環嵌套異步的問題

nodejs中解決異步嵌套循環和循環嵌套異步的問題

輸出的結果也是預期的結果.

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女