为什么我的异步函数返回得太早?

时间:2018-09-21 22:27:59

标签: javascript node.js async-await

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

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()中调用异步函数的结果时,我得到了未完成的承诺。尽管异步函数的要点是,它会在调用时等待promise被解决,那么我在做什么错了?

3 个答案:

答案 0 :(得分:4)

async函数返回承诺。这行:

const connectionsWithEmailsHash = getConnectionsWithEmailsHash()

...只需将connectionsWithEmailsHash设置为函数返回的承诺。要真正获得承诺的解决方案价值,您需要:

  1. 在另一个await函数中使用async(如果这意味着在顶层使用async,请参见: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...
    })
    

答案 1 :(得分:1)

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

现在,如果您想在顶层使用它,那就是另一个问题。 here回答了这个问题。

答案 2 :(得分:0)

我认为您不需要包装器功能。     const connectionWithEmailHash =等待parseConnections(arg);

这应该可以处理给定的代码。

有问题的代码段将无法正常运行,因为异步功能应返回一个Promise。因此,请尝试在getConnectionWithEmailHash中返回一个用connectionsWithEmails解决的promise,您的代码应该可以正常工作。