2017-01-26 44 views
1

我在節點JS驗證碼/火力點:需要執行功能時的forEach函數結束

ref.child("recipts").once("value", function(usersSnap) { 
    usersSnap.forEach(function(reciptsSnap) { 
     reciptsSnap.forEach(function(reciptSnap) { 

     reciptSnap.ref.child("last_recipt").once("value", function(b) { 
      b.forEach(function(c) { //Here I fill some "product" object 
       }); 
     }); 

     reciptSnap.forEach(function(b) { //Here I fill some "product" object 
     }); 

     }); 
    }); 
    }); 

我需要執行正當「reciptSnap」 forEachs完成的功能。我怎樣才能做到這一點,我嘗試使用變量i ++和i--但只適用於每次迭代。 我調用的函數是用於處理我用forEachs循環中的填充數據創建的產品對象。

+1

我對'firebase'不熟悉,但它似乎並不嚴格相關。如果你在'forEach'內部運行的操作是異步操作,那麼你不能以正確的方式去做你想做的事情。更好的方法是在數組中使用promise,並使用'Promise.all()'執行它們:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all –

+0

我開始寫一個答案,但對這段代碼試圖做什麼以及數據結構的樣子感到困惑。你能分享這段代碼處理的JSON的小片段(如文本,沒有截圖)嗎?您可以通過點擊[Firebase數據庫控制檯](https://console.firebase.google.com/project/_/database/data)中的「導出JSON」鏈接來獲取此信息。 –

+0

您確定需要執行reciptSnap.ref.child(「last_recipt」)。once(「value」)?在您的收據節點上獲取「value」時應該已包含這些數據。嘗試reciptSnap.child(「last_recipt」 ).forEach(相反,如果這樣的話,你的代碼不再是異步的,當內部的foreach完成後,一切都會好起來的) – arneson

回答

1

嘗試:當你沒有收據節點上的「價值」

reciptSnap.child("last_recipt").forEach(function(b) { 
     b.forEach(function(c) { 
       //Here I fill some "product" object 
     }); 
    }); 

這應該因爲所有數據的工作應該已經被取出。

如果這樣做,你的代碼不再是異步的,並且在最後一個forEach之後,你可以執行你想要的功能。

reciptSnap.forEach(function(b) { 
     //Here I fill some "product" object 
    }); 
    //Execute your function here 
    }); 
+0

墨西哥時間3:34上午測試明天謝謝 – arnoldssss

2

如果我理解正確的,你要調用函數時reciptsSnap.forEach是完整的,它裏面的所有異步任務也完成了。

爲實現此目的,可以使用index參數和傳遞給forEach的callback函數的原始數組。 (See Documentation

該代碼將是這樣的:

下面的代碼是在不改變所使用的當前forEach循環結構。然而,重新寫入與Promiseasync的代碼將是更好的&更乾淨的方式來做到這一點)。

var loop1Done = false; 
var loop2Done = false; 

ref.child("recipts").once("value", function (usersSnap) { 
    usersSnap.forEach(function (reciptsSnap) { 
     reciptsSnap.forEach(function (reciptSnap, index, colA) { 

      const idx = index; 
      const col = colA; 

      reciptSnap.ref.child("last_recipt").once("value", function (b) { 

       const i = idx; 
       const c = col; 

       b.forEach(function (c, j, colB) { //Here I fill some "product" object 

        // Do what you want here 

        // Check if all done for this loop 
        if ((j >= colB.length) && (i >= c.length)) { 

         loop1Done = true; 

         // Check if all loops done 
         if (loop1Done && loop2Done) { 
          // Call final callback function 
          // e.g. myFinalCallback(); 
         } 
        } 
       }); 
      }); 

      reciptSnap.forEach(function (b, k, colC) { //Here I fill some "product" object 

       const i = idx; 
       const c = col; 

       // Do what you want here 

       // Check if all done for this loop 
       if ((k >= colC.length) && (i >= c.length)) { 

        loop2Done = true; 

        // Check if all loops done 
        if (loop1Done && loop2Done) { 
         // Call final callback function 
         // e.g. myFinalCallback(); 
        } 
       } 
      }); 

     }); 
    }); 
}); 
+0

請給我一個例子,或承諾我無法達到執行 – arnoldssss

+0

您能否首先確認這是否適用於您?因此,我可以確定我已正確理解您的要求。 –

+0

我看到您試圖獲得什麼,但是一個forEach標記爲錯誤: at C :\ Users \ asasas-api \ routes \ cronSubscription \ index.js:76:33 – arnoldssss

相關問題