await function()不等待函数完成,因此返回未定义的结果

时间:2019-03-25 09:33:55

标签: javascript

我调用一个函数,然后在控制台中输出它的返回值,如下所示:

Index.getInitialProps = async ctx => {
    const { loggedInUser } = await checkLoggedIn(ctx)
    console.log('Data actually returned:')
    console.log(loggedInUser)
    return { loggedInUser }
}

挺直的...

checkLoggedIn函数如下:

export function checkLoggedIn(ctx) {
    ctx.apolloClient.query({
        query: GET_ME,
    })
        .then(({ data }) => {
            console.log('Data to be returned:')
            console.log(data)
            return { loggedInUser: data }
        })
        .catch(() => { return { loggedInUser: {} } })
}

再次,非常简单。这实际上是此示例的精确副本:checkLoggedIn()getInitialProps

现在我希望发生的是,我应该在控制台中看到以下内容:

Data to be returned:
{ <DATA> }
Data actually returned:
{ loggedInUser: { <DATA> }

相反,我看到了:

Data actually returned:
undefined
Data to be returned:
{ <DATA> }

这在函数返回正确的数据时具有零意义,因此在继续进入console.log之前,它应该等待返回的数据。

相反,它完全忽略了“等待”,甚​​至不用费心等待函数返回值再继续。

这是怎么回事?

3 个答案:

答案 0 :(得分:3)

您只能(有用)await一个承诺。

函数checkLoggedIn没有return语句,因此它返回undefined

undefined不是一个承诺,因此await对其无效。

更改checkLoggedIn,以便返回承诺。

答案 1 :(得分:3)

() => { return { loggedInUser: {} } }是一个返回{ loggedInUser: {} }的函数。 then中的函数也是如此。

因此,checkLoggedIn没有return。它应该返回它构造的承诺:

return ctx.apolloClient.query({

答案 2 :(得分:-2)

我认为您应该使checkLoggedIn成为异步函数