javascript - await 不能按预期在nodejs项目上工作
问题描述
再会。
我正在从事一个快速项目,但无法完全理解异步功能是如何工作的。这是我的项目结构
-controllers --userController.js -services --paymentService.js
支付服务是第三方支付工具的实现,它定义了一个我使用的方法,就像这样
const pay = async(data) => {
service.pay()
.then(function(response){
return response;
}).catch(function(err)){
console.log(err);
});
}
我从我的 userController 调用这个方法
let payUser = async(req, res) => {
const response = await paymentService.pay(req.data);
if(response) {
res.send(response)
}
}
但是响应总是未定义的,它不会像我认为的那样等待,因为“await”关键字。
这究竟是如何工作的?如果我想让它等到返回响应,我做错了什么?
解决方案
pay
您的函数代码中存在问题:
const pay = async(data) => {
service.pay()
.then(function(response){
return response;
}).catch(function(err)){
console.log(err);
});
}
你不返回任何东西。你只要跑service.pay()
。因此,函数的签名pay
(在第一行声明)是一个返回 promise 的函数,但返回类型是Promise<void>
,而不是Promise<YourData>
。这会导致它始终 return undefined
,即使在使用 调用时也是如此await
,就像在您的完整示例代码中一样。
我注意到您return response;
在“then”回调中有代码。这可能意味着您打算在数据准备好时将该数据返回给pay
(not ) 的调用者。service.pay
为此,应pay
以以下两种方式之一重写您的函数:
- 替换
service.pay ...
为return service.pay ...
使得返回的承诺service.pay
实际上返回给 的调用者pay
。 - 重写它,以便删除“then”回调并替换
service.pay ...
为return await service.pay ...
. 您已经投入工作将其设计pay
为异步函数,因此您现在可以await
在其中使用,这通常会使此类代码在以后更易于编写和阅读。
推荐阅读
- function - Kotlin:覆盖(并指定)通用接口函数
- powerbi - 如何在 Power BI 中获取行主组总数的子组百分比?
- sql - 如何返回一行而不是两行?
- apache-kafka - Kafka生产者:如何公平平衡kafka消费者之间的消息(而不是分区之间)
- c++ - 如何编写代码来计算 C++ 中几个变量函数的偏导数?
- python - 如何在“else”之前运行“if not”语句:
- javascript - 如何在 bootstrap-vue 中为下拉菜单设置动画
- r - 减少 R 中条件语句的数量?
- javascript - 仅在第一次加载时出现语法错误,刷新页面后就会消失
- c# - 直接减去两个八进制数而不转换成十进制