2012-02-22 5 views
3

JSON과 함께 작업하고 응답의 요소 수를 계산하려고합니다. 그 결과함수에서 변수의 JS 가시성

$.getJSON("/api/getEvents", function(data) { 
     $.each(data, function(key, event) { 
      var count = 10; 
      $.getJSON("/api/getUsers", function(data) { 
       $.each(data, function(key, event) { 
        alert("Value: " + count); 
        count++; 
       }); 
      }); 
      alert("Count: " + count); 
     }); 
    }); 

, 내가 얻을 :

Value: 10 
Value: 11 
Value: 12 
... 
Count: 10 

왜 = 10을 계산?

+0

저는 이것이 대답으로 게시되지 않는 이유입니다.하지만 저는 $ .getJSON에서 변수 개수에 대한 참조 만 캡처하는 클로저를 생성한다고 생각합니다. – helpermethod

+0

'getUsers' 호출의'data'가 빈 배열 인 것처럼 보입니다. 개수를 10으로 설정하고 0으로 증가시킨 다음 개수 : 10으로 경고합니다. –

+0

@BenLee 아니요 배열이 비어 있지 않습니다. 데이터에서 요소의 가치를 얻을 수 있습니다. –

답변

3

왜냐하면 ajax 요청은 비동기식이기 때문입니다. $.getJSON은 요청을 시작하지만 자바 스크립트 실행은 즉시 계속됩니다. 당신은 당신이 아약스 콜백 내부의 경고를 이동하면 카운트를 볼 수 있습니다

$.getJSON("/api/getEvents", function(data) { 
    $.each(data, function(key, event) { 
     var count = 10; 
     $.getJSON("/api/getUsers", function(data) { 
      $.each(data, function(key, event) { 
       alert("Value: " + count); 
       count++; 
      }); 

      // I moved this here: 
      alert("Count: " + count); 
     }); 
     // It used to be here. 
    }); 
}); 

그래서 당신은 var count = 10 설정 한 후, 자바 스크립트 파서가 다음 $.getJSON을 실행하지만 즉시에있는 다음 행으로 진행하여 코드 예제가 "개수 : 10"을 경고했습니다. 그런 다음 요청이 완료 될 때마다 카운트를 증가시키고 Value 행을 경고하는 콜백 코드를 실행합니다.

+0

처음에 생각한 것이 있습니다. 그러나 질문에서 경고는 당신이 말하는 곳이 아닙니다. 실제로는 이미 getJSON 콜백 안에 있습니다. – joidegn

+0

@ 조이, 그 질문에 실수였습니다. 나는 "Value"라인이 어디서 왔는지 물어 본 후에 그것을 수정했다. –

+0

감사합니다. 이해합니다. –

관련 문제