【问题标题】:await doesnt work on nodejs project as expectedawait 不能按预期在nodejs项目上工作
【发布时间】:2021-11-14 13:49:02
【问题描述】:

美好的一天。

我正在从事一个快速项目,但无法完全理解异步功能是如何工作的。这是我的项目结构

-控制器 --userController.js -服务 --paymentService.js

支付服务是第三方支付工具的实现,它定义了一种我使用的方法

const pay = async(data) => {
    service.pay()
        .then(function(response){
            return response;
        }).catch(function(err)){
             console.log(err);
        });
} 

我从我的用户控制器调用这个方法

let payUser = async(req, res) => {

    const response = await paymentService.pay(req.data);
    if(response) {
        res.send(response)
    }
}

但响应总是未定义的,它不会像我认为的那样等待,因为“await”关键字。

这究竟是如何工作的?如果我想让它等到响应返回,我做错了什么?

【问题讨论】:

  • 你不会从你的pay 函数返回任何东西,所以await 没有任何东西。
  • pay 函数本身可以使用 try/catch/finally 和 await 重写,因为您费心将其声明为异步......这可能会为您澄清事情,或者您可以只返回承诺链
  • 但是当我在服务调用上定义“then()”函数时,它应该等待服务完成承诺,然后他返回响应,用户控制器等待直到发生这种情况,不应该工作像那样?
  • 在 'service.pay' 之前添加一个 return 到目前为止 pay 函数什么都不返回(所以没有什么可以等待)
  • 您应该编辑问题的标题以更准确地描述您的问题,这不是 await 关键字在您的 Node.js 项目中无法按预期工作,而是异步函数你写的每次都返回undefined,即使你在等待它。

标签: javascript express asynchronous async-await


【解决方案1】:

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>。这会导致它始终返回 undefined,即使在使用 await 调用时也是如此,就像在您的完整示例代码中一样。

我注意到您在“then”回调中有代码return response;。这可能意味着您打算在数据准备好时将该数据返回给pay(而不是service.pay)的调用者。为此,应使用以下两种方式之一重写您的 pay 函数:

  1. service.pay ...替换为return service.pay ...,这样service.pay返回的promise实际上返回给pay的调用者。
  2. 重写它,以便删除“then”回调并将service.pay ... 替换为return await service.pay ...。您已经投入工作将 pay 设计为异步函数,因此您现在可以在其中使用 await,这通常会使此类代码在以后更易于编写和阅读。

【讨论】:

    最近更新 更多