Вопрос по jquery, json, response – Как сохранить ответ JSON в jQuery?

4

Я хотел бы сохранить свой ответ json в глобальной переменной, чтобы я мог использовать его в своем приложении, не делая запрос getJSON более одного раза.

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


console.log(data);

Если я регистрирую его в фактическом запросе, это нормально, но я получаю & quot; неопределенное & quot; где-либо еще. Любой комментарий ценится.

Редактировать [скопировано из комментариев]: Пробовал ...

$.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); 
}) ;

Первый журнал в порядке, второй не определен.

Редактировать [скопировано из ответа]:

actually both method worked

the interesting thing is that my request was in a function and i tried to acces my global variable right after the request in the same function

when i accesed it outside the function it worked like a charm

Интересно, обращались ли вы к своей глобальной переменной до ее обновления? Из примера JQuery: Примечание: имейте в виду, что строки после этой функции будут выполняться перед обратным вызовом. Thomas L Holaday
Вы можете быть правы насчет обновления, но как именно я могу узнать, обновился ли мой глобальный var? или куда я должен поместить свой запрос, чтобы мой глобальный var обновлялся до того, как я его использую, единственное, о чем я могу думать, - это написать все в ответном запросе, но это звучит глупо soda01

Ваш Ответ

4   ответа
0

$ .ется асинхронным). Ваша переменная не определена, поскольку она еще не определена, ответ еще не завершен. Другие люди предложили переместить ваш 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
    });
});
0

который позволяет вам установить переменную в одном $ (document) .ready () и использовать его в другом $ (document) .ready ().myglobals является объектом пространства имен, который, возможно, уменьшает вероятность столкновения вашей глобальной переменной с кем-то еще, особенно если вы называете это чем-то более умным, чем "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.

@ soda01, я скопировал источник в вашем комментарии к вашему вопросу, чтобы он хорошо отформатировал.
извините за непристойный комментарий, я вроде как новенький soda01
$ .myglobals = {результат: & quot; unset & quot; } $ (document) .ready (function () {$ .getJSON (& quot; panorama.json & quot ;, function (json) {$ .myglobals.result = json.images [0] .src; console.log ($. myglobals .result);}); console.log ($. myglobals.result);}) первый журнал в порядке, но второй по-прежнему не определен soda01
1

#ID) и получить его по мере необходимости.

я думаю, что все будет хорошо, если это будет простая строка, но на самом деле это огромный объект json soda01
8

у вас есть проблема с попыткой доступа к данным, которые не были установленыyet, Просто потому что твой$.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");
}
я буду иметь это в виду, спасибо soda01
да, я понял, что это проблема времени в конце концов. только что реализовал его, используя флаг и setInterval при проверке, и он работает хорошо soda01
@ soda1, соглашение в StackOverflow - обновлять исходный вопрос, а не публиковать ответ.
на самом деле оба метода работали, интересно то, что мой запрос был в функции, и я попытался получить доступ к моей глобальной переменной сразу после запроса в той же функции, когда я принял ее за пределами функции, она работала как чудо, спасибо вам обоим soda01

Похожие вопросы