【问题标题】: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)
    });
});

这是最佳方式吗?

【问题讨论】:

    标签: node.js api asynchronous async-await


    【解决方案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 中。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-06-30
              • 2021-11-01
              • 2021-12-01
              • 2016-07-07
              • 2016-03-25
              • 2017-10-09
              相关资源
              最近更新 更多