Pregunta

Me gustaría almacenar mi respuesta json en una variable global para poder usarla a través de mi aplicación sin hacer una solicitud getJSON más de una vez.

var data;
$.getJSON("panorama.json",function(json){
data = json.images[0].src;
console.log(data);          
});


console.log(data);

Si lo registro en la solicitud real, está bien, pero obtengo '' indefinido '' en todos lados. Cualquier comentario aplicado.

Editar [copiado de los comentarios]: Probado ...

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

El primer registro está bien, el segundo no está definido.

Editar [copiado de la respuesta]:

  

en realidad ambos métodos funcionaron

     

lo interesante es que mi   solicitud estaba en una función y lo intenté   para acceder a mi variable global derecha   después de la solicitud en la misma función

     

cuando accedo fuera de la función   funcionó a las mil maravillas

¿Fue útil?

Solución

Si su código real está estructurado así, entonces tiene un problema al intentar acceder a los datos que aún no se han configurado . El hecho de que su $ .getJSON () esté por encima de console.log () no significa que obtenga la respuesta antes de registrar el valor de los datos.

Entonces, su problema no es el alcance, sino el momento: introduzca algún retraso del lado del servidor y su solución también podría fallar.

Tal vez debería establecer alguna marca si se recibió la respuesta:

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

Otros consejos

Puede insertarlo en un atributo en el DOM (como un #ID) y recuperarlo según sea necesario.

Aquí hay un enfoque que le permite establecer la variable en un $ (documento) .ready () y usarlo en un $ (documento) .ready () diferente. myglobals es un objeto de espacio de nombres que posiblemente reduzca las posibilidades de que su variable global colisione con la de otra persona, especialmente si lo nombra algo más inteligente 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']);
});

Enlace transitorio al código anterior en jsbin.

$ .getJSON dispara una solicitud ajax (la palabra clave en el alcance de la pregunta es asíncrona). Su variable no está definida porque aún no se ha definido, la respuesta no ha terminado. Otras personas sugirieron mover su console.log más abajo en su código, pero no hay garantía de que sea utilizable a menos que su lógica esté sincronizada con una función de devolución de llamada. $ .getJSON acepta una función de devolución de llamada como uno de sus 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top