异步/等待不等待返回值
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 - 异步等待和获取 - 返回值,而不是承诺?