当前位置: 首页 > 知识库问答 >
问题:

异步函数返回未定义/挂起的promise,但在代码中不允许等待

葛海阳
2023-03-14

我看了类似的问题,没有找到一个解决方案,我可以实现到我自己的代码,因此我做了这篇文章。我有以下代码:

async function getProgram(id) {
    let study = "";
    pool.query('SELECT name FROM Programs WHERE id=?', [id], (error, result) => {
      if (error) return console.error(error); // If error, show error in console (in red text) and return
      console.log(result[0].name);
      return result[0].name;
    });
    
    return study;
}

let program = (id) => {
  await getProgram(id)
    .then(study => {
        return study;
    })
    .catch(error => {
      console.error(error);
    });
}

console.log(program(2));

最后一个console.log返回undefined,尽管pool.query中的console日志提供了我要查找的正确字符串。我尝试过的这段代码的另一个版本给出了暂挂的promise,而不是未定义的promise。

通过阅读其他文章,我理解这是因为我没有将wait与async函数一起使用。问题是,如果我尝试在最后一个console.log中插入await:console.log(await程序(2)) 或在程序函数中:let program=(id)=

我仍然是非常新的promise/异步/等待,所以我肯定我错过了一些基本的东西。.感谢所有的帮助。


共有1个答案

卞坚成
2023-03-14

只能在异步函数内部使用wait。您应该这样定义程序:

let program = async (id) => {
  await getProgram(id)
    .then(study => {
        return study;
    })
    .catch(error => {
      console.error(error);
    });
}

接下来,now程序是一个promise,console.log(程序(2))不会打印已解决的promise。为此,您需要使用一些其他语法,如:

program(2).then(result => console.log(result));

必须这样做,因为wait不能在顶级代码上使用(至少不能在所有浏览器 /node引擎中使用)。

最后,我认为您还应该重写getProgram,如下所示:

function getProgram(id) {
    return new Promise((resolve,reject) => {
        pool.query('SELECT name FROM Programs WHERE id=?', [id], (error, result) => {
            if (error) {
                console.error(error); // If error, show error in console (in red text) and return
                reject(error)
            }
            console.log(result[0].name);
            resolve(result[0].name);
       });
    });
}

请注意research没有做任何事情,以及您需要如何将池异步函数转换为promise

 类似资料:
  • 我试图理解为什么这段代码返回“Promise{pending}”。 当我通过reduceDirections()函数时,我可以看到我得到了想要的结果。但是当我(一行之后)时,我会改为“Promise pending” 很抱歉,我不理解promise和异步等待。我曾尝试在mdn上阅读和观看视频,但我不知道如何将它们显示的内容转移到这个问题上。提前感谢您的帮助!

  • 我真的需要温习一下我的异步等待和promise。我想要一些建议。 我正在对firebase firestore进行异步函数调用。函数应根据单个输入参数返回字符串。 该功能适用于1-1用户聊天。该功能是创建聊天/查找现有聊天,并返回其ID。 现在,我得到的作为返回值的和不知道为什么。除了返回之外,该函数还能正常工作。 我有两个功能。一个是React类组件生命周期方法,另一个是我的firebase异步

  • 我正在使用编写promise代码。然后现在,我决定使用wait/async编写它。我在promise中调用了一个函数add_,然后在中调用了另一个函数。然后是该函数的一部分。这是我使用的代码。然后 这是使用wait/async的代码。 使用await/async的代码显示了一个错误,即add\u lessons是意外标识符。那么,告诉我如何在promise中定义异步函数?

  • 我正在使用下面的gql查询生成一个GraphQL请求。 但是当我在下面的代码中注销它时,它返回未定义的。 知道我做错了什么吗?该怎么纠正?

  • 我试图了解异步/等待如何与promise一起工作。 据我所知,await应该是阻塞的,在上面的代码中,它似乎阻塞了返回带有原语

  • 我正在学习react native,我遇到了一个问题。为什么从异步函数返回时获取数据会返回一个promise,但在异步函数本身中,它会正确地返回一个对象数组? 在上,我调用我的异步函数,该函数反过来提取api url: 在,我得到了正确的json对象列表,我可以使用。但后来,返回包含奇数数据的promise: ... 我再也找不到我的json对象了。为什么会这样?更重要的是,如何在中检索json数