Axios API调用返回Promise对象而不是结果?

时间:2017-01-07 16:44:45

标签: javascript reactjs axios

在开始之前,请允许我说我是Javascript的新手,对axios API调用很新,所以我可能会犯一个菜鸟错误......

我有这个函数shift_jis,它用于映射数组并从Axios API调用返回数据。 API调用和map函数都有效,但我得到的是Promise对象而不是我想要的数据。

我认为这是因为在有足够的时间实际获取数据之前返回数据,但不确定如何修复?我尝试了getObjects(),但这似乎不起作用。

.setTimeout()

(额外的转义字符是我文本编辑的好处。)

the WhatWG have a spec that dictates it - 打开控制台以查看问题。这是一个React项目,但我不认为任何React的东西都是问题。 编辑:Codepen是使用 getObjects() { let newsItems = this.state.arrayofids.map((index) => { let resultOfIndex = axios.get(`https:\/\/hacker-news.firebaseio.com/v0/item/${index}.json`).then((res) => { let data = res.data; //console.log(data.by); // this prints the correct byline, but // all the bylines are printed after // the console.log below... if (!data.hasOwnProperty('text')) return data; }); /// end of axios request return resultOfIndex; }); /// end of map /// ideally this would end in an array of response objects but instead i'm getting an array of promises... console.log(newsItems); } 建立工作解决方案的链接,如下所示

谢谢!

编辑:这是我的工作解决方案。

axios.all

2 个答案:

答案 0 :(得分:2)

helper(d_sample, d_Image, numCols(), numRows()); 函数应该更适合您当前的场景。

答案 1 :(得分:1)

您的console.log正在立即执行,而不是等待请求完成,因为它们不是同步的。您必须在console.log之前等待所有回复。

选项1 (艰难之路): 将您的console.log替换为

newsItems.forEach((promise, index) => {
  promise.then((object)=>{
    newsItems[index] = object
    if (index+1 == newsItems.length) {
      console.log(newsItems)
    }
  })
})


选项2 (更好的方法): 使用axios.all

  getObjects() {
    axios.all(this.state.arrayofids.map((id) => {
      return axios.get(`https:\/\/hacker-news.firebaseio.com/v0/item/${id}.json`)
    })).then((res) => {
      console.log(res)
    })
  }
顺便说一句,我肯定会推荐改变

this.state.arrayofids.map((index) => {
      let resultOfIndex = axios.get(`https:\/\/hacker-news.firebaseio.com/v0/item/${index}.json`)...

被称为id而不是index