J'ai une fonction asynchrone dans le contrôleur qui devrait attendre une autre fonction de service renvoyant une valeur, mais elle ne l'attend pas. Si une seule (ou la meilleure) façon de résoudre ce problème est de renvoyer une nouvelle promesse malgré la juste valeur? Code du contrôleur
exports.trip = (options) => { return new Promise((resolve, reject) => { osrm.trip(options, function (err, result) { if (err) reject(err); resolve(result) }); });
osrmService code: (n'attend pas la valeur)
exports.trip = async (options) => { osrm.trip(options, await function(err, result) { if (err) throw err; //console.log(result) return result; });
Je l'ai fait de cette manière et cela fonctionne correctement: p>
exports.trip = async (req, res, next) => { try { let result = await osrmService.trip(req.body.options); console.log(result) //result is undefined res.status(200).json({ route: result }); } catch (error) { next(error) }
Est-ce le moyen optimal?
5 Réponses :
utilisez la promesse pour renvoyer la valeur et la résoudre avant de la renvoyer à la fonction principale
Bienvenue à SO. Je pense que vous vous trompez avec votre osrmService. Vous devez lui faire renvoyer la valeur du osrm.trip
soit en ajoutant un return
derrière osrm.trip
soit en supprimant les accolades. Voici un exemple:
exports.trip = async (options) => osrm.trip(options, await function(err, result) { if (err) throw err; //console.log(result) return result; });
Ou
exports.trip = async (options) => { return osrm.trip(options, await function(err, result) { if (err) throw err; //console.log(result) return result; }); }
Oui. Ce que vous avez fait en retournant la promesse est une manière optimale. Chaque fois que vous avez besoin d'utiliser async / await, la fonction à laquelle vous ajoutez await devrait être une fonction de retour de promesse pour la faire attendre jusqu'à ce qu'elle soit résolue
vérifiez également celui-ci
exports.trip = async (options) => { try{ const result = await osrm.trip(options) return result; }catch(err){ throw err; } });
BTW, votre méthode de retour de la promesse est également correcte, ces deux implémentations renvoient un objet de promesse
Le problème est que la fonction osrm.trip est asynchrone et qu'au moment où le rappel est appelé, le flux d'exécution a déjà été renvoyé par la fonction. Fondamentalement, il retourne undefined dans votre cas. La solution serait d'envelopper cette fonction dans la promesse.