2011-01-21 51 views
14

Estoy tratando de obtener el resultado de una solicitud ajax para establecer en una variable a la que puedo acceder fuera de esa solicitud. He intentado esto JQuery - Storing ajax response into global variable pero mi variable beer permanece indefinida fuera de las funciones $.getJSON y $.ajax (probé ambas).Jquery - Almacene respuesta jSON Ajax como variable

Aquí está mi código y donde puedo ver los resultados del console.log(beer).

var beer; 
$.getJSON(jsonUrl, function (json) { 
    beer = json; 
    console.log(beer); // returns beer 
}); 
console.log(beer); // returns undefined 

var beer = (function() { 
    var result; 

    $.ajax({ 
     url: jsonUrl, 
     success: function (data) { 
      result = data; 
      console.log(beer); // returns beer 

     } 
    }); 
    console.log(result); // returns undefined 
    if (result) return result; 
})(); 
console.log(beer); // returns undefined 

Respuesta

17

Eso es una solicitud asíncrona, por lo que se dispara, pero su secuencia de comandos no espera una respuesta antes de continuar. Si tiene que esperar en una petición Ajax para terminar, intentar algo como esto:

var beer; 
$.getJSON(jsonUrl,function(json){ 
    beer = json; 
    checkDrink();     
});   

function checkDrink() { 
    console.log(beer); 
} 
+1

Entonces, ¿cómo puedo acceder a la cerveza más adelante en el script desde fuera de la función? – Sebastien

+1

Cualquier cosa que dependa del resultado de esa solicitud JSON debe estar en esa función separada. – chprpipr

+0

¿Y por qué no funcionaría esto? \t \t \t \t cerveza = $ .ajax ({ \t \t \t \t \t url: jsonUrl, \t \t \t \t \t éxito: function (datos) { \t \t \t \t \t \t de datos de retorno; \t \t \t \t \t} \t \t \t}); – Sebastien

0

El problema es que usted está tratando de acceder a los datos antes de que realmente regresa desde el servidor, la función de 'éxito' es en realidad una devolución de llamada que se llama cuando la llamada ajax finaliza correctamente. El .ajax $ (o $ .Consulte) devuelven inmediatly ...

Tendría que la señal de alguna manera a las funciones interesadas que tenemos los datos en el var 'cerveza' dentro de su devolución de llamada éxito

1

sugieren que el código de abajo:

var beer = $.ajax({ 
    url: jsonUrl, 
    async: false, 
    dataType: 'json' 
}).responseJSON; 

Los momentos clave son:

  1. conjunto async a falso, para devolver el resultado como variable, no para llamar a la devolución de llamada asincrónica
  2. establecer dataType a json para analizar la respuesta del servidor str ing as json
Cuestiones relacionadas