-1
votes

Comment attendre le résultat d'un appel à une fonction qui n'est pas une promesse, mais contient une promesse?

Tout d'abord, je sais qu'il y a déjà beaucoup de choses à propos de ASYNC ici, mais j'ai regardé dans de nombreux endroits sur et éteindre, donc et non rien trouvé qui semble répondre à cette question particulière, du moins pas aux yeux non entraînés de cette noob.

fond h2>

J'ai une fonction foo code> qui dépend du résultat d'une autre fonction Googleplaces code> qui contient em> Une promesse, mais la fonction globale n'est pas une promesse. P>

JS H2>
var googleMapsClient = require('@google/maps').createClient({
  key: <API_KEY>
  Promise: Promise
});
...
function foo() {
  
  var point = [49.215369,2.627365]
  var results = googlePlaces(point)
    console.log('line 69')
    console.log(results)
    
    // do some more stuff with 'results'
 
   }

function googlePlaces(point) {

    var placesOfInterest = [];

    var latLng = (point[0]+','+point[1])
    var request = {
      location: latLng,
      radius: 10000
    };

  
    googleMapsClient.placesNearby(request).asPromise()
    
    .then(function(response){        
       placesOfInterest.push(response.json.results)      
       }) 

    .finally(function(){
       console.log('end of googlePlaces function:')
       console.log(placesOfInterest);
       return(placesOfInterest);
       })
    
}


0 commentaires

3 Réponses :


0
votes

Si vous êtes sûr que foo retourne une promesse, ce qui le garde à la chaîne avec ensuite:

function foo() {

  var point = [49.215369,2.627365]
  var results = googlePlaces(point)
   return results;
 }

(new Promise(function(res){
     res(foo());
})).then(function(result){
//do something with result..
})


2 commentaires

La promesse de nidification est un anticipen: Stackoverflow.com/questions/23803743/...


Regardez les parenthèses là-bas, je dispose toujours d'une chaîne non imbriquée, le suivant que devrait être le plus haut niveau. Je ne sais pas ce que Foo revient, n'est-ce pas? Est-il préférable d'adapter les normes de codage ou d'être de sécurité en l'enveloppant avec RES (FOO). Blesse personne.



3
votes

dans googleplaces () faire:

retour googlemapsclient.placesNearby (demande) .Aspromise ();

alors dans foo () faire: xxx


3 commentaires

Oui, ça le fait! Donc, d'analyser cela, est-il sans danger de dire que si vous avez une promesse dans une fonction qui est appelée d'ailleurs dans le code, il est préférable que la promesse soit le retour de cette fonction , plutôt que de rentrer quelque chose après la promesse?


Oui, c'est un bon moyen d'y penser. Cela facilitera également la manipulation des exceptions, car vous pouvez commencer à centraliser cette partie. Comme vous continuez à penser à des promesses et à vous concevoir des pièces mobiles, pensez à Action Code (GetGoogleplaces), Modèle / entité Code (lieux) et Control code (foo) les pièces pour tirer des trucs ensemble.


Une autre petite avancée dans mon voyage de développement à l'écoute! Je vais essayer de suivre ces principes d'action, de modèle et de contrôle. Merci!



0
votes

sans avoir à changer votre code trop, vous pouvez envelopper la promesse de Google Lieux dans une autre promesse qui bulle jusqu'à FOO (). De là, vous pouvez gérer les résultats.

function foo() {

    var point = [49.215369,2.627365]
    var promise = googlePlaces(point)

    promise.then((results) => {
        // do stuff with 'results'
        console.log(results)
    });

}

function googlePlaces(point) {

    var placesOfInterest = [];

    var latLng = (point[0]+','+point[1])
    var request = {
      location: latLng,
      radius: 10000
    };

    return new Promise((resolve) => {
        googleMapsClient.placesNearby(request).asPromise();
        .then(function(response){        
           placesOfInterest.push(response.json.results)      
           }) 

        .finally(function(){
           console.log('end of googlePlaces function:')
           console.log(placesOfInterest);
           // resolve the promise 
           resolve(placesOfInterest);
           })
    });
}


2 commentaires

Les promesses de nidification sont un anticipateur. Stackoverflow.com/Questtions/23803743/...


Mieux que d'avoir à déplacer leur logique sur les Googleplaces et de finir potentiellement à dupliquer cette logique plus tard