【问题标题】:await function() doesn't wait for function to complete so returns result as undefinedawait function() 不等待函数完成,因此返回未定义的结果
【发布时间】:2019-08-15 12:24:58
【问题描述】:

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

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 之前等待返回的数据。

相反,它完全忽略了“等待”,甚​​至无需等待函数返回值,然后继续。

这是怎么回事?

【问题讨论】:

标签: javascript


【解决方案1】:

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

函数checkLoggedIn没有return语句,所以它返回undefined

undefined 不是一个承诺,所以awaiting 它没有任何效果。

更改 checkLoggedIn 使其返回承诺。

【讨论】:

  • 你可以await一个不承诺。 await 43 计算为 43。这样做没有多大意义。
  • 它在 .then() 和 .catch() 中都有返回值,所以不管它应该返回什么值?
  • 看我的回答。它从匿名回调函数返回,而不是从checkLoggedIn
  • @GCM — 不。这不是从回调中返回值的工作原理。如果你想从checkLoggedIn返回,那么checkLoggedIn本身需要一个return语句。
【解决方案2】:

() =&gt; { return { loggedInUser: {} } } 是一个返回{ loggedInUser: {} } 的函数。 then 中的函数同上。

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

return ctx.apolloClient.query({

【讨论】:

    【解决方案3】:

    我认为你应该让 checkLoggedIn 成为一个异步函数

    【讨论】:

    • 然后它的返回值变成了一个承诺,立即解析为undefined,这没有帮助。
    猜你喜欢
    • 2018-09-23
    • 2018-09-18
    • 1970-01-01
    • 2020-12-23
    • 2020-11-14
    • 2020-05-13
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多