【问题标题】:Why am I getting back "undefined" from my Axios call, when it should return me objects?为什么我从我的 Axios 调用中返回“未定义”,它应该返回我的对象​​?
【发布时间】:2018-01-11 19:40:57
【问题描述】:

问题介绍:

在我的 React 应用程序中,我正在对 Github 进行一些 API 调用以获取一些用户数据。在另一个函数中,我调用这些函数并使用 Axios 的 .all() 方法等待它。

我想获取数据并使用.then() 对其进行处理,但返回的值只是一个包含 2 次未定义的数组

预期会发生什么:

它应该返回我 2 个玩家对象,对象的 profile 键中有个人资料信息,对象的 score 键中有一个分数值。

简而言之,我的应用在做什么?

它从 2 个用户名中获取数据,并且他们可以互相“战斗”。它只是获取分数和关注者并返回一个总和。最后它(应该)返回一个数组,其中包含 2 个玩家对象,这些对象已经与获胜者排序(exampleArray[0])。

一般信息 这是一个使用组件的反应应用程序。这实际上是关于一个非常小的组件和另一个文件中的辅助函数。

这是我调用自定义函数的地方(返回未定义的函数):

componentDidMount() {
    const players = queryString.parse(this.props.location.search); //<== the usernames
    const playersArray = [players.playerOneName, players.playerTwoName];
    console.log(playersArray); // <== this logs the output as expected (an array with 2 usernames)

    battle(playersArray).then((data) => {   // <== the function it's all about
        console.log(data); // <== data is => [undefined, undefined];
    })
}

接下来是上面的战斗功能,它使用了另外两个功能:

战斗

export function battle(players) { // <== players aray with 2 usernames as string
return axios.all(players.map(getUserData)) // <== look 1 function below
    .then(sortPlayers) // <== two functions below
    .catch(handleError)
}

获取用户数据

let getUserData = (player) => {
axios.all([
    getProfile(player),
    getRepos(player)
]).then((data) => {
    return {
        profile: data[0],
        score: calculateScore(data[0], data[1])
    }
})
}

排序播放器

let sortPlayers = (players) => {

return players.sort((a, b) => {
    return b.score - a.score;
})
}

好的,所以他们也使用其他功能,但它们真的不是太复杂。当您也需要其他小帮手的示例时,请告诉我。

我尝试将调试器放置在代码中的不同位置,控制台记录了不同的内容,但我无法通过(我第一次真正使用 Promise)。现在坐在这个小问题前面 2 个小时,我想不通。

我认为问题出在战斗功能本身或getUserData

最后是一个小截图,我的 console.log 的输出如下所示:http://prntscr.com/hz5abq

提前致谢

【问题讨论】:

  • 您需要调试回调以找出数据丢失的位置。我知道你已经这样做了,但为了解决这个问题,我们基本上必须建立一个副本。实际上,没关系,getUserData 不会返回 axios()
  • 那位先生解决了我的问题。我不知道现在该感觉好还是坏。再次感谢。

标签: javascript reactjs promise axios


【解决方案1】:

在 getUserData 中没有返回任何内容。添加 return 或删除 {} 包装 axios.all

let getUserData = (player) => {

    return axios.all([
        getProfile(player),
        getRepos(player)
    ]).then((data) => {
        return {
            profile: data[0],
            score: calculateScore(data[0], data[1])
        }
    })

}

【讨论】:

  • 您好,解决了我的问题。当你在这里时,我有一个小问题要问你。在stackoverflow上评论每个答案是好的还是常见的做法?对我来说没问题,但这样做可能不好?我对堆栈很陌生,我用谷歌搜索了但找不到任何东西:D 再次感谢您!
  • 不,很好,很受欢迎。在这种情况下,我认为您立即知道问题出在哪里,但如果答案与预期的不完全一样,通常会在澄清或调整上来回切换
  • 再次感谢 :) 非常感谢。
【解决方案2】:

getUserData 需要返回它创建的承诺。目前它没有返回任何东西,所以返回了一个隐含的未定义,因此players.map(getUserData) 导致[undefined, undefined] 的数组

也就是说,这样做:

let getUserData = (player) => {
    // VVV added return statement
    return axios.all([
        getProfile(player),
        getRepos(player)
    ]).then((data) => {
        return {
            profile: data[0],
            score: calculateScore(data[0], data[1])
        }
    })
}

【讨论】:

  • 感谢您解决了我的问题。当然,我忽略了一些重要的事情。
猜你喜欢
  • 2012-01-05
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2015-01-07
相关资源
最近更新 更多