代码之家  ›  专栏  ›  技术社区  ›  adam tropp

为什么异步函数返回得太快[[副本]

  •  1
  • adam tropp  · 技术社区  · 6 年前

    我尝试使用异步函数来调用另一个函数中的函数。看起来是这样的:

    const getConnectionsWithEmailsHash = async () => {
        const connectionsWithEmails = await parseConnections('./tmp/connections.csv') 
        console.log(connectionsWithEmails)
        return connectionsWithEmails
    }
    
    const connectionsWithEmailsHash = getConnectionsWithEmailsHash()
    console.log(connectionsWithEmailsHash) 
    

    当我在async函数中输入console.log()时,我得到了期望的哈希值,但是当我输入console.log()调用async函数的结果时,我得到了promise pending。我认为异步函数的意义在于它在被调用时等待承诺被解析,那么我做错了什么呢?

    3 回复  |  直到 6 年前
        1
  •  5
  •   T.J. Crowder    6 年前

    async 函数返回承诺。这条线:

    const connectionsWithEmailsHash = getConnectionsWithEmailsHash()
    

    …刚刚好 connectionsWithEmailsHash 函数返回的承诺。要真正获得承诺的解析值,您需要:

    1. await 在另一个内部 异步 函数(如果这意味着使用 How can I use async/await at the top level? ):

      const connectionsWithEmailsHash = await getConnectionsWithEmailsHash()
      

      或者,

    2. 使用 then 在承诺上

      getConnectionsWithEmailsHash()
      .then(connectionsWithEmailsHash => {
          // ...use `connectionsWithEmailsHash`....
      })
      .catch(error => {
          // ...handle error...
      })
      
        2
  •  1
  •   Nicholas Pipitone    6 年前

    getConnectionsWithEmailsHash本身仍然是一个异步函数。connectionsWithEmails有效,因为您正在等待parseConnections,但connectionsWithEmailsHash无效,因为getConnectionsWithEmailsHash正在并行运行。尝试“等待getConnectionsWithEmailsHash”。

    现在,如果你想在顶层使用这个,那是另一个问题。这个问题得到了回答 here .

        3
  •  0
  •   Shubham Gupta    6 年前

    我认为你不需要包装器函数。 const connectionWithEmailHash=等待解析连接(arg);

    这应该适用于有问题的给定代码。

    由于异步函数应该返回一个承诺,所以有问题的代码段将不起作用。因此,尝试在getConnectionWithEmailHash中返回一个承诺,该承诺与ConnectionWithEmails解析,您的代码应该可以工作。