2016-07-12 6 views
0

だから私は、ユーザーがいずれのイベントでも管理者であるかどうかを確認しようとしています。なんらかの理由で、配列は最後のfindのインデックスで埋められます。なぜこれが起こっているのか?配列に間違ったインデックスが設定されたままになる

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

インデックスを渡すことができるIIFEで 'let'またはラップを使うか、そうでなければXは常に10になります。なぜならあなたのDBは非同期であるからです。 – ndugger

答えて

0

ループはすでに、匿名関数が呼び出されるので、current = 10された時点で終了します。それはクロージャーに関するスコープの問題です。

これを行うための正しい方法は

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

どうですか?関数はループ内にあります。 –

+0

'.then'メソッドの呼び出しはループ内にありますが、各反復で引数として無名関数を渡すだけです。これらの無名関数の中の 'current'への参照はすべて同じ変数を指して終わります。つまり、ループの最後に最新の電流が更新されるので、値10で終わります。 – TW80000

+1

もっと必要な場合はクロージャを参照してくださいこの情報は:) – TW80000

関連する問題