1
votes

async / wait n'attend pas la valeur renvoyée

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?


0 commentaires

5 Réponses :


0
votes

utilisez la promesse pour renvoyer la valeur et la résoudre avant de la renvoyer à la fonction principale


0 commentaires

0
votes

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;
  });
}


0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

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.


0 commentaires