2012-02-12 9 views
1

알아낼 수 없습니다. 대규모 객체가 JSON 파일로 저장되어 있으므로 한 번 액세스하여 여러 번 사용하고 싶습니다.파일에서 json 데이터를 가져 오는 방법 (jQuery)

var myjson = new Object(); 
$.getJSON("myJSON.js", function(json) { 
    myjson = JSON.stringify(json); 
}); 
$('#console').append(myjson); 

아무 것도 수행하지 않습니다. 범위 문제입니다. 나는 단지 내가 원하는 것을하는 법을 모른다. $ .getJSON 호출 내에서 모든 함수를 수행해야합니까? 아니면 런타임 동안 사용할 수있는 객체를 전달할 수있는 방법이 있습니까?

+2

참고로, 당신이 쓸 수있는'{}'대신 새 개체'의()'. – ThiefMaster

+0

@ ThiefMaster. 아니면 콜백 밖에서 반환 값을 사용할 수 없기 때문에 그냥 삭제하십시오. – gdoron

+0

네, 당연히 더 낫지 만 - 응용 프로그램의 다른 코드에 따라 'undefined'대신 빈 객체를 갖는 것이 더 나을 수도 있습니다. – ThiefMaster

답변

4

범위 문제입니다.

아니요, 범위 지정 문제는 아닙니다. AJAX 작동 방식에 대한 이해가 문제입니다. AJAX는 비동기식입니다. 즉, AJAX 요청을 보내면이 요청을 보낸 함수 (귀하의 경우 $.getJSON)가 즉시 반환됩니다. 성공 콜백 내부에서만 결과를 사용해야합니다. 이 콜백 함수는 훨씬 나중에 호출 될 수 있습니다. 그것은 미래에 어떤 순간에 이것이 일어날 지 당신에게 정말로 의존하지 않습니다. 서버에 오류가 발생하면 실제로는 절대로 발생할 수 없습니다.

그래서 당신은 확실하게 AJAX 호출 후 전송 서버가 성공 콜백 안에 그 결과를 소비 할 수있는 유일한 장소 :

$.getJSON("myJSON.js", function(json) { 
    // here and only here you can access the results of your AJAX call. 
    $('#console').append(JSON.stringify(json)); 
}); 

당신에게 동기 호출을 수행하는 것처럼 할 수있는 몇 가지 끔찍한 일이있다 서버 :

var myjson = { }; 
$.ajax({ 
    url: 'myJSON.js', 
    dataType: 'json', 
    async: false, 
    success: function(json) { 
     myjson = JSON.stringify(json); 
    } 
}); 
$('#console').append(myjson); 

async: false 옵션은 동기식 호출을 만듭니다. 분명히 이것은 AJAX의 모든 목적을 완전히 무효로합니다. 왜냐하면이 호출 중에 브라우저를 멈출 것이기 때문입니다. 직접 스크립트 태그와 myJSON.js 등의 아마 더 나은 :이 방법에서 얻을 수 있습니다

<script type="text/javascript" src="myJSON.js"></script> 

또 다른 이점은 브라우저가이 스크립트는 완전히 다른 스크립트를 실행하기 전에로드되었는지 당신을 위해 확인하는 것입니다. 그래서 다음은 잘 작동 할 수 : 나중에 다음

<script type="text/javascript" src="myJSON.js"></script> 
<script type="text/javascript"> 
    var myjson = someJavascriptVariableThatYouDeclaredInMyJSON; 
</script> 

과 :

<script type="text/javascript"> 
    $('#console').append(JSON.stringify(myjson)); 
</script> 
+0

아마도 개체를 다시 문자열 화하는 것을 원하지 않을 것입니다. IE를 사용하지 않는 한, 콘솔에서 실제로 멋지게 볼 수 있습니다. 미리보기가 아닌 json 문자열보다 훨씬 좋습니다. – ThiefMaster

+0

@ThiefMaster, 예, OP가'id = "console"'-'$ ('# console'). append (...)와 함께 일부 DOM 요소에서 JSON을 인쇄하려고하는 것 같습니다. 그래서 그는 자바 스크립트 디버깅 콘솔이 아닌 HTML로 예쁜 인쇄 *가 필요하다고 생각합니다. –

+0

Ooops, 그것을 알아 채지 못했습니다. @philtune : 최신 브라우저에는 div/textarea/등보다 훨씬 강력한 콘솔이 있습니다. 디버깅 데이터를 표시합니다. – ThiefMaster

관련 문제