异步/等待不等待返回值

Posted

技术标签:

【中文标题】异步/等待不等待返回值【英文标题】:async/await not waiting for returning value 【发布时间】:2020-03-13 18:59:57 【问题描述】:

我在控制器中有一个异步函数,它应该等待另一个服务函数返回值,但它没有等待它。如果只有一个(或最好的)解决此问题的方法是返回新的 Promise,尽管只是价值? 控制器代码

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)

osrmService 代码:(不等待值)

exports.trip = async (options) => 
osrm.trip(options, await function(err, result) 
    if (err) throw err;
    //console.log(result)
    return result;
);

我以这种方式完成了它并且它工作正常:

exports.trip = (options) => 
return new Promise((resolve, reject) => 
    osrm.trip(options, function (err, result) 
        if (err) reject(err);
        resolve(result)
    );
);

这是最佳方式吗?

【问题讨论】:

【参考方案1】:

使用promise返回值并在返回主函数之前解决它

【讨论】:

【参考方案2】:

欢迎来到 SO。我认为你的 osrmService 错了。您应该通过在osrm.trip 后面添加return 或删除花括号来使其返回osrm.trip 的值。这是一个例子:

exports.trip = async (options) => 
  return osrm.trip(options, await function(err, result) 
      if (err) throw err;
      //console.log(result)
      return result;
  );

或者

exports.trip = async (options) => osrm.trip(options, await function(err, result) 
      if (err) throw err;
      //console.log(result)
      return result;
  );

【讨论】:

【参考方案3】:

是的。您通过返回 Promise 所做的事情是最佳方式。每当您需要使用 async/await 时,添加 await 的函数应该是一个 promise 返回函数,以使其等待直到它被解决

【讨论】:

【参考方案4】:

也检查一下这个

exports.trip = async (options) => 
    try

      const result = await osrm.trip(options)
      return result;
    catch(err)
        throw err;
     
);

顺便说一句,您返回承诺的方法也很好,这两个实现都返回一个承诺对象

【讨论】:

【参考方案5】:

问题是 osrm.trip 函数是异步的,当回调被调用时,执行流程已经从函数返回。基本上它在您的情况下返回未定义。解决方案是将该函数包装在 Promise 中。

【讨论】:

以上是关于异步/等待不等待返回值的主要内容,如果未能解决你的问题,请参考以下文章

如果我不关心它的返回值,我应该等待一个“异步任务”函数吗? [复制]

Javascript - 异步等待和获取 - 返回值,而不是承诺?

返回一个等待的值返回一个 Promise? (es7 异步/等待)

Javascript-异步等待并获取-返回值,而不是诺言?

NodeJS,从异步等待中获取返回值

如何在异步等待函数中返回值?