axios 在 "axios.all" 函数中承诺 returns 正确值,但在 "then" 函数中未定义

axios promise returns correct value in "axios.all" function, but is undefined in the "then" function

我正在学习一个教程,其中请求来自 git API 的数据,评分算法将对这些数据进行排序。

战斗函数将采用两个元素的数组,即两个 github 用户。我们从 getUserData 方法

中检索每个用户的个人资料和分数
module.exports = {
  battle: function(players) {
      return axios.all(players.map(getUserData))
        .then(response => {
           response.forEach( each=>console.log(each));
           return response;
       })
  }
}

getProfile 和 getRepos 函数可以正确检索包含用户个人资料(用户名、关注者等)及其存储库(存储库名称等)数据的对象。所以我省略了这两个函数的代码,因为我已经知道它们确实有效。此外,calculateScore 方法也可以正常工作,并且 returns 按预期输出。

console.log 语句显示带有键 "profile" 和 "score" 的对象已正确生成,并按预期打印出配置文件对象数据和分数。到目前为止一切顺利。

function getUserData(player) {
  axios.all([
    getProfile(player),
    getRepos(player)
  ])
    .then(function(data) {
        var profile = data[0];
        var repos = data[1];

        console.log({
            profile: profile,
            score: calculateScore(profile, repos)
        })

        return {
            profile: profile,
            score: calculateScore(profile, repos)
        }
    })
}

问题:

"battle" 中的回调函数应接收大小为 2 的数组,每个元素包含该特定玩家的个人资料和分数。例如:

[
 {
   profile: {profile data for player1...}
   score: 10 //or whatever the score is
 },
 {
   profile: {profile data for player2...}
   score: 2 //or whatever the score is
 }
]

但回调函数从 axios.all 函数

接收 [undefined, undefined] 作为其输入

如果我错了请纠正我,但我保证,"axios.all" 方法的输出不应该是 "then" 方法的输入。那么,如果 console.log 语句显示 axios.all 正在输出正确的数据,为什么我会得到 undefined?

您的 getUserData 函数没有 return 任何东西。更改如下:

function getUserData(player) {
  return axios.all([
  // ...
  ]);
}

这种行为是因为当您执行 response.map 时,您 return 一个 undefined 值的数组,您将所有项目替换为 undefined (console.log returns undefined).

相反,return 异步调用的实际结果:

module.exports = {
  battle: function(players) {
      return axios.all(players.map(getUserData))
        .then(response => {
            response.forEach(each => console.log(each));
            return response;
        });
  }
}