Como armazenar resposta JSON em jQuery?
Pergunta
Eu gostaria de guardar a minha resposta JSON em uma variável global Então, eu poderia usá-lo através do meu aplicativo sem fazer um pedido getJSON mais de uma vez.
var data;
$.getJSON("panorama.json",function(json){
data = json.images[0].src;
console.log(data);
});
console.log(data);
Se eu registrá-lo no pedido real o seu bem, mas eu recebo "indefinido" em qualquer outro lugar. Qualquer comentário appriciated.
Editar [copiado de comentários]: Tentei ...
$.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);
}) ;
O primeiro registro é bom, o segundo é indefinido.
Editar [copiado de resposta]:
realmente ambos método funcionou
O interessante é que a minha pedido foi em uma função e eu tentei de acessar o meu direito variável global após o pedido na mesma função
quando eu accesed que fora da função ele trabalhou como um encanto
Solução
Se o seu código real está estruturado como esse, então você tem um problema com a tentativa de acessar os dados que não foi definido ainda . Só porque o seu $.getJSON()
está acima console.log()
não significa que você obter a resposta antes de valor dos dados de log.
Então, o problema não é o escopo, mas sim o momento:. Apresentar algum atraso do lado do servidor e sua solução pode também falhar
Talvez você deve definir alguma bandeira se a resposta foi recebida:
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");
}
Outras dicas
Você pode inseri-lo em um atributo no DOM (como um n.º ID) e recuperá-lo conforme necessário.
Aqui está uma abordagem que permite que você defina a variável em um $ (document) .ready () e usá-lo em um $ diferente (document) .ready (). myglobals
é um objeto namespace que, sem dúvida, reduz as chances de seu variável global colidindo com alguém, especialmente se o nome dele algo mais inteligente do que "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']);
});
Transient ligação para o código acima em jsbin.
$. GetJSON dispara uma solicitação ajax (a palavra-chave no âmbito da questão de ser assíncrono) .Seu variável é indefinido, porque não foi definem ainda, a resposta não foi concluída. Outras pessoas sugeriram movendo o mais baixo console.log no seu código, mas não há nenhuma garantia de que vai ser usado a menos que sua lógica é sincronizado com uma função de chamada de retorno. $ .GetJSON aceita uma função de retorno como um dos seus parâmetros.
$.getJSON( "myData.json", function( data ) {
//Do whatever, this is a callback
$.each( data, function(key, val) {
//You can get even more specific like so
});
});