Cette question est posée plusieurs fois dans SO. Mais je ne peux toujours pas avoir de trucs.Comment renvoyer la valeur d'une fonction de rappel asynchrone?
Je souhaite obtenir une valeur de rappel. Regardez le script ci-dessous pour des éclaircissements.
function foo(address){
// google map stuff
geocoder.geocode({ 'address': address}, function(results, status) {
results[0].geometry.location; // I want to return this value
})
}
foo(); //result should be results[0].geometry.location; value
Si j'essaie de retourner cette valeur, je deviens simplement "indéfini". J'ai suivi quelques idées de SO, mais échoue toujours.
Ce sont:
function foo(address){
var returnvalue;
geocoder.geocode({ 'address': address}, function(results, status) {
returnvalue = results[0].geometry.location;
})
return returnvalue;
}
foo(); //still undefined
Toute personne qui a obtenu ici [** S'il vous plaît lire cette première question **] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call). Il explique comment s'attaquer efficacement à ce problème. –
** [Pourquoi ma variable est-elle inchangée après que je l'ai modifiée dans une fonction? - Référence de code asynchrone] (http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron) ** fournit également une explication plus générale et détaillée du problème. –
Utilisez Q, ou l'une de ses variantes, comme la bibliothèque $ q fournie avec angularJs. Et ne jamais regarder en arrière. Les fonctions asynchrones retournent immédiatement indéfini. Donc, ne perdez jamais votre temps à essayer de faire des choses sur indéfini. Ne jamais utiliser le mot-clé 'return' dans vos fonctions asynchrones, comme vous le faites habituellement. Utilisez plutôt des promesses différées. deferred.resolve (STUFF que vous voulez faire), alors vous pouvez revenir plus tard simplement que, «retour deferred.promise; '. :) – ISONecroMAn