447 votes

Comment faire pour retourner la valeur d’une fonction de rappel asynchrone ?

Cette question est posée à plusieurs reprises dans SO. Mais encore je ne peux pas obtenir des trucs.

Je veux obtenir une valeur de callback.look à soufflet script d’éclaircissement.

Si j’essaie de renvoyer cette valeur juste obtenir « indéfinie ». J’ai suivi quelques idées de SO, mais toujours échoue.

Ce sont :

451voto

Sean Kinsey Points 17117

C'est impossible que vous ne pouvez pas utiliser un appel asynchrone à l'intérieur d'une méthode synchrone.

Dans ce cas, vous devez passer un rappel à toto qui va recevoir la valeur de retour

function foo(address, fn){
  geocoder.geocode( { 'address': address}, function(results, status) {
     fn(results[0].geometry.location); 
  });
}

foo("address", function(location){
  alert(location); // this is where you get the return value
});

La chose est, si l'intérieure d'un appel de fonction est asynchrone, puis toutes les fonctions 'habillage' l'appel doit être asynchrone afin de "retour", une réponse.

Si vous avez beaucoup de rappels, vous pourriez envisager de prendre le plongeon et l'utilisation d'une promesse de la bibliothèque comme Q.

23voto

Pointy Points 172438

Il est insensé de retourner des valeurs dans un rappel. Au contraire, faire le travail de « foo() » vous voulez faire à l’intérieur de votre rappel.

Rappels asynchrones sont appelées par le navigateur, soit par certains cadre comme la bibliothèque de géocodage Google où les événements se produisent. Il y a pas de place pour les valeurs retournées aller.

15voto

alex heyd Points 881

S’il vous arrive d’utiliser jQuery, vous pourriez vouloir donner un coup de cela : http://api.jquery.com/category/deferred-object/

Il vous permet de différer l’exécution de votre fonction de rappel jusqu'à ce que la requête ajax (ou n’importe quelle opération async) est terminée. Cela permet aussi d’appeler un rappel une fois que plusieurs requêtes ajax ont toutes terminées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X