【问题标题】:Cannot read property 'then' of undefined for axios wrapper无法读取 axios 包装器未定义的属性“then”
【发布时间】:2020-04-23 20:31:54
【问题描述】:

我有一点类似的问题like this,但我似乎无法正确解决。我知道我必须向return 作出承诺,我想我会这样做,尽管它仍未被接受。这是我的 axios 调用的包装函数:

export const callGraph = (url, token) => {
  return axios.get(url, {headers: { Authorization: `Bearer ${token}` }})
}

这是调用callGraph 的函数,而Promise 又应该返回一个Promise

export const getGraphProfile = () => {
  if (auth.getAccount()) {
    auth.getToken(loginRequest)
      .then(response => {
        return callGraph(graphConfig.graphMeUrl, response.accessToken)
      })
      .catch(error => { console.log(error) })
  }
}

如您所见,我明确请求return callGraph,所以我可以像这样使用它:

getGraphProfile()
   .then(response => { console.log('givenName ', response.data.givenName) })
   .catch(error => console.log(error))

出于某种原因,我仍然缺少一些东西。谢谢您的帮助。

【问题讨论】:

  • 您没有从外部函数返回任何内容 (getGraphProfile)。返回auth.getToken 调用的结果。在auth.getAccount返回false的情况下,注意你会返回undefined,你会破坏调用者。您可以返回一个被拒绝的承诺来涵盖该案例。但我认为使用 async / await 会更干净。
  • 你能举例说明如何使用rejected 承诺吗?那只是new Promise((reject) => {reject('my error')}).catch 部分吗?
  • 要创建一个被拒绝的承诺,您可以使用帮助器:Promise.reject('reason')。但是我想问一下,当auth.getAccount() 返回 false 时,getGraphProfile 函数的预期行为是什么?它应该“错误”吗?它应该返回一些“默认*值”吗?
  • 它应该返回来自auth.getToken()的错误。然后调用getGraphProfile 的调用者仍然可以决定在catch 子句中做什么。 Thx for that oneliner,非常方便。
  • 如果 auth.getAccount 返回 false,则不会调用 auth.getToken,因为它不会输入 if。我错过了什么吗?

标签: javascript promise


【解决方案1】:

你应该返回 axios 承诺

export const getGraphProfile = () => {
  if (auth.getAccount()) {
    return auth.getToken(loginRequest)
      .then(response => {
        return callGraph(graphConfig.graphMeUrl, response.accessToken)
      })
      .catch(error => { console.log(error) })
  }
}

【讨论】:

  • 我以为我是通过在 callGraph 之前添加 return 来做到这一点的。但显然它需要由父函数再次返回,如您所说。非常感谢,我一直盯着这个有一段时间了。欣赏它:)
  • 我知道那种感觉,有时候错误就在你面前,但你看不到它
猜你喜欢
  • 2021-09-24
  • 2017-04-21
  • 2019-08-19
  • 2016-10-23
  • 2014-09-07
  • 2015-09-08
  • 2018-01-12
相关资源
最近更新 更多