for循環異步操做問題小結

在實際開發中,異步老是不可逃避的一個問題,尤爲是Node.js端對於數據庫的操做涉及大量的異步,同時循環又是不可避免的,想象一下一次一個數據組的存儲數據庫就是一個典型的循環異步操做,而在循環以後進行查詢的話就須要確保以前的數據組已經所有存儲在了數據庫中。能夠獲得關於循環的異步操做主要有兩個問題:javascript

  • 如何確保循環的全部異步操做完成以後執行某個其餘操做
  • 循環中的下一步操做依賴於前一步的操做,如何解決

如何確保循環的全部異步操做完成以後執行某個其餘操做

方法一:設置一個flag,在每一個異步操做中對flag進行檢測java

let flag = 0;
for(let i = 0; i < len; i++) {
  flag++;
  Database.save_method().exec().then((data) => {
      if(flag === len) {
            // your code
      }
  })
}
複製代碼

方法二:將全部的循環放在一個promise中,使用then處理數據庫

new Promise(function(resolve){
      resolve()
 }).then(()=> {
     for(let i = 0; i < len; i++) {
           Database.save_method().exec()
     }
}).then(() => {
    // your code
})
複製代碼

循環中的下一步操做依賴於前一步的操做,如何解決

方法一:使用遞歸,在異步操做完成以後調用下一次異步操做promise

function loop(i){
  i++;
  Database.save_method().exec().then(() => {
      loop(i)
    })
}
複製代碼

方法二:使用async和await異步

async function loop() {
    for(let i = 0; i < len; i++) {
         await Database.save_method().exec();
    }
}
複製代碼

以上的方法基本上能解決大部分的問題。async

相關文章
相關標籤/搜索