Вопрос

Я хотел бы сохранить свой ответ 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); 
}) ;

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

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

  

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

     

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

     

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

Это было полезно?

Решение

Если ваш реальный код структурирован таким образом, у вас есть проблема с попыткой доступа к данным, которые еще не были установлены . Тот факт, что ваш $. 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. "

$.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-запрос (ключевое слово в контексте вопроса является асинхронным). Ваша переменная не определена, поскольку она еще не определена, ответ не завершен. Другие люди предложили перенести ваш 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
    });
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top