axios promise在“axios.all”函数中返回正确的值,但在“then”函数中未定义

时间:2017-05-30 14:34:58

标签: javascript promise axios

我正在遵循一个教程,其中请求来自git API的数据,并且评分算法将订购该数据。

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

中检索eah用户的配置文件和分数
module.exports = {
  battle: function(players) {
      return axios.all(players.map(getUserData))
        .then(response => {
           response.forEach( each=>console.log(each));
           return response;
       })
  }
}

getProfile和getRepos函数正确地检索具有用户配置文件(用户名,关注者等)及其repos(repo名称等)数据的对象。所以我省略了这两个函数的代码,因为我已经知道它们可以正常工作。此外,calculateScore方法也可以正常工作并按预期返回输出。

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)
        }
    })
}

问题:

“战斗”中的回调函数应该接收一个大小为2的数组,每个元素包含该特定玩家的个人资料和分数。 e.g:

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

但是回调函数接收[undefined,undefined]作为axios.all函数的输入

如果我错了,请纠正我,但在承诺中,不是“axios.all”方法的输出应该是“then”方法的输入。那么,如果console.log语句显示axios.all正在输出正确的数据,为什么我会得到未定义?

1 个答案:

答案 0 :(得分:2)

您的getUserData函数不会返回任何内容。将其更改如下:

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

这种行为是因为当您undefined response.map时,如果您使用undefined替换所有项目,则会返回console.log值数组undefined返回module.exports = { battle: function(players) { return axios.all(players.map(getUserData)) .then(response => { response.forEach(each => console.log(each)); return response; }); } } )。

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

import requests

import webbrowser

s=requests.session()

login_data = dict(email='email', password= 'password')

s.post("https://www.otoservisbul.com/tr/login", data=login_data)

r = requests.post('https://www.otoservisbul.com/tr/login', data = {'email':'password'})

webbrowser.get(using='chrome').open("https://www.otoservisbul.com/tr/items/list")