2012-10-03 7 views
0

가능한 중복 :
jQuery AJAX: return value on success자바 스크립트 코드

임 메신저 쿼리를 통해 JSON 파일을 얻으려고 노력 이상한 참조 문제 갖는

var themeData; 
    $.getJSON("json/sample.js", function(data) { 
       themeData = data.theme; 
         console.log(themeData.sample[0].description); 
      }); 
    console.log(themeData.sample[0].description); 

첫 번째 console.log가 작동하고 두 번째 콘솔이 작동하지 않습니다. 왜 이런 일이 일어나는 걸까요?

답변

5

두 번째로 (코드에서 시간순으로) 치는 것이 아닙니다. 그것은 아직 설정되지 않았기 때문입니다. getJSON 내부의 콜백은 서버에서 반환 된 후 비동기 적으로 호출됩니다.

var themeData; 

// FIRST -- themeData currently null 
$.getJSON("json/sample.js", function(data) { 

    // THIRD -- now themeData has a value, and gets logged 
    themeData = data.theme; 
    console.log(themeData.sample[0].description); 
}); 

// SECOND -- themeData still null 
console.log(themeData.sample[0].description); 

당신이 정말로 다음, getJSON "후"메소드를 호출 콜백의 아이디어를 수용해야 할 경우. 이런 식으로 사용하십시오.

var themeData; 
function myCallback(data) { 
    console.log(data.sample[0].description); 
} 
$.getJSON("json/sample.js", function(data) { 
    themeData = data.theme; 
    console.log(themeData.sample[0].description); 
    myCallback(themeData); 
}); 

또한 대신 JQuery와 아약스 기능의 async: false를 사용하여 동기 호출을 강제 할 수

편집.

$.ajax({ 
    url: url, 
    dataType: 'json', 
    data: data, 
    success: callback, 
    async: false 
}); 
+0

하지만이 솔루션은 범위를이 특정 콜백 함수로만 제한합니다. 나는 전체 문서를 통해이 정보에 접근 할 필요가있다. 대신 다른 방법을 고려해야합니까? –

+0

@ CarlosR.Batista 위의 업데이트를 참조하십시오. 강제 호출을 통해 동기식 호출이 가능하면 코드가 작동합니다. 동기 호출은 실제로 서버를 기다리는 동안 클라이언트 스크립트를 차단하므로 실제로 사용하지 않아야합니다. – McGarnagle

+0

사실, 클라이언트가 이미 가져온 모든 데이터를 뒤집어서 동일한 페이지 (웹 앱)에서 약 30 분을 소비하는 동안이 json 파일을 한 번만 가져 오는 것입니다. 다른 옵션은 나에게 너무 효율적으로 보이지 않는이 파일에서 데이터 한 조각을 필요로 할 때마다 아약스 호출을하는 것입니다. Im은 비동기를 추측하는 것이이 경우에 올바른 호출이라고 생각하십니까? –

0

아니, $.getJSON는 비동기 방식, 두 번째 console.log가 호출 될 때, 그 시간에 더 themeData이 없습니다입니다.