【问题标题】: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() 中执行它。 (可能我缺少一些重要的理解)

【问题讨论】:

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


    【解决方案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;
           });
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-11
      • 2015-04-21
      • 1970-01-01
      • 2015-08-15
      • 2022-01-14
      • 2019-12-19
      • 1970-01-01
      相关资源
      最近更新 更多