首页 > 解决方案 > 从具有另一个异步函数的异步函数返回数据

问题描述

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

sequelize在节点和快递应用程序中使用。现在,所有的查询功能findOneasync在本质上。我有两个功能,

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(). (可能我缺少一些重要的理解)

标签: javascriptnode.jsexpressasync-awaitsequelize.js

解决方案


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

问题是当你把 B().then()... Javascript 期望 B() 函数返回一个 Promise,实际上 B() 函数作为一个异步函数返回一个 Promise,但它没有任何返回语句,所以它解析为未定义。

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;
       });
    }

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


推荐阅读