Come restituire un valore da una funzione che chiama $ .getJSON?

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

Perché il valore returnValue di questa funzione è sempre uguale al valore predefinito impostato all’inizio della funzione e mai al valore recuperato dalla ricerca JSON?

Questo accade perché quella funzione di callback ( function(data) {...} ) viene eseguita più tardi quando la risposta ritorna … perché è una funzione asincrona. Usa invece il valore una volta impostato, in questo modo:

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

Questo è il modo in cui dovrebbe essere tutto il comportamento asincrono, dare il via a qualsiasi cosa abbia bisogno del valore una volta ottenuto … che è quando il server risponde con i dati.

Se non si desidera utilizzare la funzione asincrona, utilizzare al meglio quanto segue:

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

Questa funzione attende finché il valore non viene restituito dal server.

La funzione che si passa a getJSON viene eseguita quando arriva la risposta alla richiesta HTTP che non è immediata.

L’istruzione return viene eseguita prima della risposta, quindi la variabile non è stata ancora impostata.

Fai in modo che la funzione di callback faccia ciò che deve fare con i dati. Non cercare di restituirlo.