异步/等待不等待返回值

时间:2019-11-18 11:56:11

标签: node.js api asynchronous async-await

我在控制器中有一个异步函数,该函数应等待另一个返回值的服务函数,但不是在等待它。解决这个问题的唯一方法(或最好的方法)是尽管有价值但仍然返回新的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)
    });
});

这是最佳方法吗?

5 个答案:

答案 0 :(得分:0)

使用promise返回值并解决该问题,然后再将其返回给主函数

答案 1 :(得分:0)

欢迎来到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;
  });

答案 2 :(得分:0)

是的。您返回Promise所做的是最佳方法。每当需要使用async / await时,向其添加await的函数应该是一个promise返回函数,以使其等待直到解决为止

答案 3 :(得分:0)

也请选中此

0 5 4 3
2 0 5 4 
3 2 0 5
4 3 2 0

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

答案 4 :(得分:0)

问题是osrm.trip函数是异步的,在调用回调时,该函数已经返回了执行流。基本上,在您的情况下,它返回undefined。解决方案是将该函数包装在promise中。