筆者最近在寫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的探索中跟進一步了