迴圈中巢狀非同步操作的流程控制

guoke360發表於2018-08-03

筆者最近在寫node.js專案中遇到了一個比較有趣的流程控制需求
需求是:先將多個object物件迴圈遍歷後進行非同步操作寫入到資料庫中去,等這部操作結束後在進行下一次的查詢操作。
這個流程需要注意的是在你foreach 或者 for迴圈的時候裡面的非同步操作是不會同步進行的,往往會導致時間相差而產生bug.

我在看了卷老師的部落格後發現可以判斷你迴圈物件的length,而每次執行結束後進行加一操作,如果長度足夠,進行ruturn寫法如下

let x = 0;
for (let x of arry){
   xxx.create(x).then(_=>{
      x= x+1;
      if(x===arry.length){
           return xxxxx;
       }
  })
}

  這種方式固然可行,但是仍然會有部分的效能不足,在社群大佬Miu的指點下我是用了js的特性,定義一個promise物件將這個非同步操作全部push進去如下

  for(let item of datas){
                  proList.push(xxx.create(let));
              }
              return Promise.all(proList).then(function (data) {
}

 由於js的是由obecjt物件構成的,所以這裡面可以將你定義的prolist中push大量的非同步操作然後統一使用promis all來執行。然後使用then來控制流程就好了。
有趣的是js是個弱型別,但是大部分的變數所定義的指向位置都是記憶體,吾輩也算是在js的探索中跟進一步了

相關文章