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.
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);
})
}
3 Réponses :
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.. })
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.
dans alors dans googleplaces () code> faire:
retour googlemapsclient.placesNearby (demande) .Aspromise (); code> p>
foo () code> faire: p>
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 i> le retour de cette fonction , plutôt que de rentrer quelque chose après i> 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 i> Code (GetGoogleplaces), Modèle / entité i> Code (lieux) et Control i > 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!
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); }) }); }
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