2009-06-19 4 views
4

내 json 응답을 전역 변수에 저장하고 싶습니다. getJSON 요청을 두 번 이상하지 않고도 내 응용 프로그램을 통해 사용할 수 있습니다.jQuery에서 JSON 응답을 저장하는 방법은 무엇입니까?

var data; 
$.getJSON("panorama.json",function(json){ 
data = json.images[0].src; 
console.log(data);   
}); 


console.log(data); 

실제 요청에 로그인하면 괜찮지 만 다른 곳에서는 "정의되지 않음"이 표시됩니다. 모든 설명이 유용합니다. 두 번째는 정의되지 ...

$.myglobals = { result: "unset" } 

$(document).ready(function() { 

    $.getJSON("panorama.json", function(json) { 
    $.myglobals.result = json.images[0].src; 
    console.log($.myglobals.result);  
    }); 

    console.log($.myglobals.result); 
}) ; 

첫 번째 로그가 괜찮습니다, 시도 :

편집 [의견에서 복사]. [답변에서 복사]

편집 :

실제로 두 방법은 일

흥미로운 것은 내 요청이 함수에 있었고, 내가 직후 을 내 전역 변수를 액세서하는 시도이다 같은 기능의 요청

기능 외에서받은 경우 매력처럼 작동

+0

전역 변수가 업데이트되기 전에 액세스했는지 궁금합니다. JQuery 예제에서 : Note :이 함수 뒤에 오는 줄은 콜백 전에 실행된다는 점에 유의하십시오. –

+0

당신은 업데이트에 대해 맞을지 모르겠지만 내 글로벌 var가 업데이트되었는지 정확히 알 수 있습니까?또는 내 전역 var 내가 그것을 사용하기 전에 업데이트 할 수 있도록 내 요청을 넣을 것이라고 생각할 수있는 유일한 것은 요청의 콜백에 모든 것을 쓰고 있지만 바보 같은 소리가 난다 :) – soda01

답변

8

실제 코드가 그런 구조로되어 있다면 아직으로 설정되지 않은 데이터에 액세스하는 데 문제가 있습니다. $.getJSON()console.log() 이상이라고해서 데이터 값을 기록하기 전에 응답을 받는다는 의미는 아닙니다.

그래서 문제는 범위가 아니라 타이밍과 관련이 있습니다. 일부 서버 측 지연을 도입하면 솔루션도 충돌 할 수 있습니다. 응답이 수신 된 경우

아마 당신은 몇 가지 플래그를 설정해야합니다

var data, dataReceived = false; 

$.getJSON("panorama.json",function(json){ 
    data = json.images[0].src; 
    dataReceived = true; 
    console.log(data);      
}); 


// somwhere later 
if (dataReceived) { 
    console.log(data); 
} else { 
    // you could use setTimeout() or setInterval here to re-check 
    console.log("data not received yet"); 
} 
+0

그래, 타이밍 문제라고 생각 했어. 방금 플래그와 setInterval 검사를 사용하여 그것을 구현하고 괜찮 았던가? – soda01

+0

실제로 두 가지 방법 모두 흥미로운 일을했습니다. 내 요청이 함수에 있었고 같은 함수에서 요청을 한 후에 바로 전역 변수에 액세스하려고했을 때입니다. 나는 당신이 모두 덕분에 같이 작동하는 기능을 외부에 accesed – soda01

+0

@ soda1, StackOverflow에서 대회는 대답을 게시하는 대신 원래의 질문을 업데이 트하는 것입니다. –

1

DOM의 속성 (예 : #ID)에 삽입하고 필요에 따라 검색 할 수 있습니다.

+0

나는 그것이 괜찮 았다고 생각한다. 간단한 문자열 있지만 실제로는 큰 JSON 개체 – soda01

0

하나의 $ (document) .ready()에 변수를 설정하고 다른 $ (document) .ready()에서 사용하는 방법이 있습니다. myglobals은 전역 변수가 다른 사람과 충돌 할 가능성을 줄이는 네임 스페이스 개체입니다. 특히 "myglobals"보다 더 영리한 이름을 지정하면 더욱 그렇습니다. jsbin에서 위의 코드에

$.myglobals = { 
    result: "unset" 
} 

$(document).ready(function() { 

    function pretend_JSON_call() { 
    $.myglobals.result = {'a':"hello", 'b':"world" }; 
    } 

    pretend_JSON_call(); 
}); 

$(document).ready(function() { 
    alert($.myglobals.result['a']); 
    alert($.myglobals.result['b']); 
}); 

Transient link.

+0

$ .myglobals의 = { 결과 : "해제" } $ (문서) .ready (함수() { $ .getJSON ("panorama.json"기능 JSON() { \t \t \t \t \t \t \t \t \t \t \t \t \t \t $ .myglobals.result = json.images [0] .src; \t \t \t \t console.log ($. myglobals.result); \t \t \t }); \t \t \t \t \t \t console.log ($. myglobals.result); }) 첫 번째 로그는 확인하지만, 두 번째는 내가 주변에서 좀 새로 온 사람이 포맷 않도록 – soda01

+0

정의되지 훌륭하게. – soda01

+0

soda01 @, 당신의 질문에 대한 코멘트에서 소스를 복사 여전히 스타일이 적용되지 않은 코멘트 죄송 –

0

$ .getJSON는 Ajax 요청 (문제되는 비동기의 범위에서 키워드를) 발사가 'hasn 때문에 부여됨 변수가 정의되지 않습니다 아직 정의되지 않았으므로 응답이 완료되지 않았습니다. 다른 사람들은 귀하의 코드에서 console.log를 더 아래로 움직일 것을 제안했지만 논리가 콜백 함수와 동기화되지 않는 한 사용할 수 있다는 보장은 없습니다. $ .getJSON은 콜백 함수를 매개 변수 중 하나로 받아들입니다.

$.getJSON("myData.json", function(data) { 
    //Do whatever, this is a callback 
    $.each(data, function(key, val) { 
     //You can get even more specific like so 
    }); 
}); 
관련 문제