Как сохранить ответ JSON в jQuery?
Вопрос
Я хотел бы сохранить свой ответ 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
});
});