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

Posted

技术标签:

【中文标题】从具有另一个异步函数的异步函数返回数据【英文标题】:Returning data from an async function having another async function 【发布时间】:2021-04-14 20:17:07 【问题描述】:

我相信这是现代 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】:

函数 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;
       );
    

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

【讨论】:

以上是关于从具有另一个异步函数的异步函数返回数据的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从异步函数返回 observable