2016-07-12 3 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); 
       } 
      });  
} 

어레이는 다음과 같이보고 끝낸다 : 은 [1010101010]

+0

무엇'x'는 당신이 그것을 로그인 할 때 그것은 무엇을 말하는가 될 수 있을까요? – Michelangelo

+0

그리고 snapshot.val()은 무엇을 제공합니다. –

+1

인덱스를 전달할 수있는 IIFE에서'let' 또는 랩핑을 사용해야합니다. 그렇지 않으면 DB 항목이 비동기이므로 X는 항상 10입니다. – ndugger

답변

0

루프가 이미 완료 시간 익명 함수 호출 등 current = 10. 클로저와 관련된 범위 문제입니다.

이 일을하는 올바른 방법은

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

어때요? 함수는 루프 내에있다. –

+0

'.then' 메소드의 호출은 루프 내부에 있지만 각 반복에서 인수로 익명 함수를 전달하기 만하면된다. 이러한 익명의 함수 내부의'current'에 대한 참조는 모두 동일한 변수를 가리키고 있습니다. 이것은 루프의 마지막에서 현재가 업데이트되는 마지막 시간이므로 값 10으로 끝납니다. – TW80000

+1

더 많은 것을 원한다면 클로저를 찾으십시오 이것에 대한 정보 :) – TW80000

관련 문제