2010-11-17 23 views
6
function lookupRemote(searchTerm) 
{ 
    var defaultReturnValue = 1010; 
    var returnValue = defaultReturnValue; 

    $.getJSON(remote, function(data) 
    { 
     if (data != null) 
     { 
      $.each(data.items, function(i, item) 
      { 
       returnValue = item.libraryOfCongressNumber; 
      }); 
     } 
    }); 
    return returnValue; 
} 

¿Por qué el returnValue de esta función siempre es igual al valor predeterminado establecido al comienzo de la función y nunca al valor recuperado de la búsqueda JSON?

+0

Consulte http://stackoverflow.com/questions/3537434/cant-get-correct-return-value-from-an-jquery-ajax-call –

+0

posible duplicado de [¿Cómo devolver la respuesta de una llamada AJAX? ] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) – Bergi

Respuesta

11

Esto ocurre porque esa función de devolución de llamada (function(data) {...}) ejecuta más tarde cuando la respuesta vuelve ... porque es una función asíncrona. En lugar de utilizar el valor una vez que lo ha configurado, así:

function lookupRemote(searchTerm) 
{ 
    var defaultReturnValue = 1010; 
    var returnValue = defaultReturnValue; 
    $.getJSON(remote, function(data) {   
     if (data != null) { 
       $.each(data.items, function(i, item) {     
        returnValue = item.libraryOfCongressNumber; 
       }); 
     } 
     OtherFunctionThatUsesTheValue(returnValue); 
    }); 
} 

Ésta es la manera asíncrona todo comportamiento debe ser, inicio a lo que necesita el valor una vez que lo tienes ... que es cuando el servidor responde con datos.

3

La función se pasa a getJSON se ejecuta cuando la respuesta a la petición HTTP llega que es no inmediatamente.

La declaración de retorno ejecuta antes de la respuesta, por lo que la variable aún no se ha establecido.

Haga que su función de devolución de llamada haga lo que necesita hacer con los datos. No intentes devolverlo.

8

Si no desea utilizar la función asíncrona, un mejor uso de los siguientes:

function getValue(){ 
    var value= $.ajax({ 
     url: 'http://www.abc.com', 
     async: false 
    }).responseText; 
    return value; 
} 

Esta función espera hasta que el valor se devuelve desde el servidor.

+0

recomendamos usar ** responseJSON ** ... gracias, ¡funciona bien! – KingRider

Cuestiones relacionadas