从具有另一个异步函数的异步函数返回数据

时间:2021-01-09 08:06:48

标签: javascript node.js express async-await sequelize.js

我相信这是现代 JavaScript 中最基本/初学者的问题之一。目前有很多类似的问题,我已经解决了其中的大部分问题。但由于我找不到准确的答案,我在一个新问题中发布了我的问题。

我在节点和快递应用中使用 sequelize。现在,所有像 findOne 这样的查询函数本质上都是 async。我有两个功能,

function A(){
   B()
   .then((result:any) => {
       if(result){
           // Do something
       }
    });
}

async function B(){
   sequelizeModel.findOne({where: {<col>:<val>}})
   .then((result:any) => {
       if(result === null){
           return true;
       }
       else{
           return false;
       }
   })
   .catch((error: any) => {
       console.error(error);
       return false;
   });
}

B() 检查数据库以查看特定数据行是否存在。因此,它将返回 true/false。基于该 A() 执行某些活动。

现在,B() 总是得到 result = undefined

一种解决方案是,

function A(){
   B()
   .then((result:any) => {
       if(result === null){
           // Do something
       }
    })
    .catch((error:any) => {
         console.error(error);
    });
}

async function B(){
   return await sequelizeModel.findOne({where: {<col>:<val>}});
}

但是有什么方法可以让我不想将空检查逻辑放在 A() 中并在 B() 中执行它。 (可能我缺少一些重要的理解)

1 个答案:

答案 0 :(得分:3)

函数 B() 必须返回您尝试在函数 A() 中捕获的承诺,因此,只需从 B() 函数返回它即可。

问题是,当你把 B().then()... Javascript 期望 B() 函数返回一个承诺,实际上 B() 函数作为一个异步函数返回一个承诺,但它没有任何 return 语句,因此它解析为 undefined。

function A(){
   B() // Handling the promise returned by B()
   .then((result:any) => {
       if(result){
           // Do something
       }
    });
}
    
function B(){
       return sequelizeModel.findOne({where: {<col>:<val>}}) //Returns the promise that A() function will handle.
       .then((result:any) => {
           if(result === null){
               return true;
           }
           else{
               return false;
           }
       })
       .catch((error: any) => {
           console.error(error);
           return false;
       });
    }

在这种情况下,异步词不是必需的,因为它正在返回承诺。