JSON 응답을 jQuery에 저장하는 방법은 무엇입니까?
문제
JSON 응답을 글로벌 변수에 저장하고 싶습니다. 그래서 GetJSON 요청을 두 번 이상 만들지 않고도 앱을 통해 사용할 수 있습니다.
var data;
$.getJSON("panorama.json",function(json){
data = json.images[0].src;
console.log(data);
});
console.log(data);
실제 요청에 로그인하면 괜찮지 만 다른 곳에서 "정의되지 않은"을받습니다. 모든 의견이 appricated.
편집 [댓글에서 복사] : 시도 ...
$.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);
}) ;
첫 번째 로그는 괜찮고 두 번째 로그는 정의되지 않았습니다.
편집 [답변에서 복사] :
실제로 두 방법이 모두 작동했습니다
흥미로운 점은 내 요청이 함수에 있었고 같은 함수의 요청 직후 내 글로벌 변수를 악용하려고했다는 것입니다.
함수 외부에 그것을 획득했을 때 그것은 매력처럼 작동했습니다.
해결책
실제 코드가 그와 같이 구성되면 설정되지 않은 데이터에 액세스하는 데 문제가 있습니다. 아직. 당신이 있기 때문입니다 $.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");
}
다른 팁
DOM (예 : #ID)의 속성에 삽입하여 필요에 따라 검색 할 수 있습니다.
다음은 변수를 하나의 $ (document) .ready ()로 설정하고 다른 $ (document) .ready ()로 사용할 수있는 접근법입니다. myglobals
글로벌 변수가 다른 사람과 충돌 할 가능성을 줄이는 네임 스페이스 객체입니다.
$.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']);
});
과도 링크 JSBIN의 위 코드에.
$ .getJson은 ajax 요청 (질문 범위의 키워드가 비동기식)을 해고합니다. 아직 정의되지 않았기 때문에 변수는 정의되지 않았으므로 응답이 완료되지 않았습니다. 다른 사람들은 콘솔을 옮기는 것을 제안했지만 코드에서 문구를 더 아래로 아래로 내립니다. 그러나 논리가 콜백 함수와 동기화되지 않으면 사용할 수 있다고 보장 할 수는 없습니다. $ .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
});
});