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