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

Foi útil?

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
    });
});
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top