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