2016-07-12 46 views
0

所以我想看看是否有任何用戶是管理員在任何情況下。出於某種原因,該數組將填充上次查找的索引。任何想法爲什麼發生這種情況?陣列不斷填充錯誤的索引

for(var x = 0;x<=10;x++){ 
      console.log(x); 
      var current = x; 
      firebase.database().ref('/Event/' + x + "/admins").once('value').then(function(snapshot) { 
       console.log(snapshot.val()); 
       if(snapshot.val()==uid){ 
       console.log("Match found at "+(current)+"!"); 
       matchingEvents.push(current); 
       } 
      });  
} 

陣列最終看起來像這樣: [10,10,10,10,10]

+0

什麼是'x'又是什麼,當你登錄它說的? – Michelangelo

+0

而snapshot.val()會給你什麼。 –

+1

你應該使用'let'或者將你的內部包裝在可以傳入索引的IIFE中,否則X總是10,因爲你的數據庫內容是異步的。 – ndugger

回答

0

環路已經由時間完成了匿名函數被調用,因此current = 10。這是與關閉有關的範圍問題。

這樣做的正確的方式可能是

.then((function(current) { 
    return function(snapshot) { 
     // Things using current 
    } 
})(current)); 
+0

它是怎麼回事?函數在循環中 –

+0

對'.then'方法的調用位於循環內部,但它僅僅在每次迭代中將匿名函數作爲參數傳遞。在這些匿名函數內部對'current'的引用最終都指向相同的變量,這是最後一次在循環結束時更新的電流,因此它最終的值爲10. – TW80000

+1

如果您想要更多這方面的信息:) – TW80000