2010-11-17 25 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; 
} 

Pourquoi le returnValue de cette fonction alway égale à la valeur par défaut définie au début de la fonction et de ne jamais la valeur récupérée de la recherche JSON?

+0

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

+0

duplication possible de [Comment renvoyer la réponse d'un appel AJAX? ] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) – Bergi

Répondre

11

Cela se produit car cette fonction de rappel (function(data) {...}) exécute plus tard lorsque la réponse est de retour ... car il s'agit d'une fonction asynchrone. Au lieu d'utiliser la valeur une fois que vous avez défini, comme ceci:

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

C'est ainsi que tout comportement asynchrone doit être, le coup d'envoi ce qui doit la valeur une fois que vous l'avez ... qui est quand le serveur répond Les données.

3

La fonction que vous passez à getJSON est exécuté lorsque la réponse à la requête HTTP arrive qui est pas immédiatement.

L'instruction return exécute avant la réponse, de sorte que la variable n'a pas encore été définie. Demandez à votre fonction de rappel de faire ce qui doit être fait avec les données.

N'essayez pas de le retourner.

8

Si vous ne souhaitez pas utiliser la fonction asynchrone, utilisez mieux ce qui suit:

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

Cette fonction attend jusqu'à ce que la valeur est renvoyée par le serveur.

+0

recommandez l'utilisation ** responseJSON ** .. merci, fonctionne bien! – KingRider