首页 > 解决方案 > 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”关键字。

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

标签: javascriptexpressasynchronousasync-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以以下两种方式之一重写您的函数:

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

推荐阅读