Как сохранить ответ JSON в jQuery? - PullRequest
4 голосов
/ 19 июня 2009

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

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

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

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

на самом деле оба метода работали

Интересно то, что мой запрос был в функции, и я попытался чтобы получить доступ к моей глобальной переменной справа после запроса в той же функции

когда я принял это вне функции это сработало как шарм

Ответы [ 4 ]

8 голосов
/ 20 июня 2009

Если ваш реальный код структурирован таким образом, у вас есть проблема с попыткой получить доступ к данным, которые еще не были установлены . То, что ваш $.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");
}
1 голос
/ 19 июня 2009

Вы можете вставить его в атрибут в DOM (например, #ID) и получить его при необходимости.

0 голосов
/ 09 октября 2013

$. GetJSON запускает ajax-запрос (ключевое слово в рамках вопроса асинхронно). Ваша переменная не определена, поскольку она еще не определена, ответ не завершен. Другие люди предложили перенести ваш 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 голосов
/ 19 июня 2009

Вот подход, который позволяет вам установить переменную в одном $ (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.

...