我调用一个函数,然后在控制台中输出它的返回值,如下所示:
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之前,它应该等待返回的数据。
相反,它完全忽略了“等待”,甚至不用费心等待函数返回值再继续。
这是怎么回事?
答案 0 :(得分:3)
您只能(有用)await
一个承诺。
函数checkLoggedIn
没有return
语句,因此它返回undefined
。
undefined
不是一个承诺,因此await
对其无效。
更改checkLoggedIn
,以便返回承诺。
答案 1 :(得分:3)
() => { return { loggedInUser: {} } }
是一个返回{ loggedInUser: {} }
的函数。 then
中的函数也是如此。
因此,checkLoggedIn
没有return
。它应该返回它构造的承诺:
return ctx.apolloClient.query({
答案 2 :(得分:-2)
我认为您应该使checkLoggedIn成为异步函数