javascript - synchrone - récupérer résultat requete ajax




Comment retourner la valeur d'une fonction de rappel asynchrone? (2)

Cette question a déjà une réponse ici:

Cette question est posée plusieurs fois dans SO. Mais je ne peux toujours pas avoir de trucs.

Je veux obtenir une certaine valeur de callback. 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

Ceci est impossible car vous ne pouvez pas revenir d'un appel asynchrone dans une méthode synchrone.

Dans ce cas, vous devez passer un rappel à foo qui recevra 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
});

Le fait est que, si un appel de fonction interne est asynchrone, alors toutes les fonctions «enveloppant» cet appel doivent également être asynchrones afin de «renvoyer» une réponse.

Si vous avez beaucoup de rappels, vous pouvez envisager de franchir le pas et d'utiliser une bibliothèque de promesses comme Q.


Cela n'a aucun sens de renvoyer des valeurs à partir d'un rappel. Au lieu de cela, faites le travail "foo ()" que vous voulez faire à l' intérieur de votre callback.

Les rappels asynchrones sont invoqués par le navigateur ou par un cadre tel que la bibliothèque de géocodage Google lorsque des événements se produisent. Il n'y a pas de place pour les valeurs renvoyées. Une fonction de rappel peut renvoyer une valeur, en d'autres termes, mais le code qui appelle la fonction ne fait pas attention à la valeur de retour.





javascript-objects