Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React:异步回调函数中未定义此选项_Javascript_Reactjs_Asynchronous - Fatal编程技术网

Javascript React:异步回调函数中未定义此选项

Javascript React:异步回调函数中未定义此选项,javascript,reactjs,asynchronous,Javascript,Reactjs,Asynchronous,我已经在这上面很久了,我需要帮助。 我试图调用一个API链接,我有一个数据数组作为调用的参数进行调用。 在调用之后,我想将组件状态设置为得到的结果 let animals = ['cats','goats'] ; async.each(animals, function(item, cb){ axios.get(`http://api.com?keyword=${item}`) .then(res=> { apiData.push(res.data)

我已经在这上面很久了,我需要帮助。 我试图调用一个API链接,我有一个数据数组作为调用的参数进行调用。 在调用之后,我想将组件状态设置为得到的结果

let animals = ['cats','goats'] ;
async.each(animals, function(item, cb){
  axios.get(`http://api.com?keyword=${item}`)
    .then(res=> {
        apiData.push(res.data)
        this.setState({
          stateData: apiData 
        });
     });
   })

async。每个
只有在您想一个接一个地执行请求时才有意义,然后您必须调用
cb()
,以便链继续:

 async.each(array, (item, cb) => { // <- arrow func!
   axios.get(`/http://api.com?keyword=${item}`)
   .then(res => {
     apiData.push(res.data);
     this.setState({ stateData: apiData });
     cb(); // <---
   });
});

PS:您应该始终处理承诺中的错误,因此只需将
.catch(/*..*/)
附加到链…,

forEach
和api请求回调使用箭头函数,这将防止javascript在回调链期间重新分配
this
的值


有关ES6中箭头函数的更多信息,请阅读:

为什么每次都设置状态?为什么不为最后一个参数设置状态呢?stateData不起作用,它表明这不起作用definded@user3424387您必须使用箭头功能(参见我的答案)@duhaime您对原始问题的编辑操纵了问题的初始含义和意图,请以后不要这样做。这有误导性。@mxdi9i7我更改了标题以反映用户在上面的评论中报告的错误。请看他们的评论。好的,我想我以前做过,但是迷路了,比如说,
cb()
是我设置stateData状态的地方
cb(apiData){this.setState({stateData:apiData});}
也非常正确。您能否给出一个实例使用
forEach
仍然是aysnc,因此您无法获得后面的值。
const animals=['cat','dog'];设apiData=[];animals.forEach((pets)=>axios.get(
{city}
)。然后(res=>apiData.push(res.data));console.log(apiData)
结果是
[]
@user3424387您不能只编辑原始问题和ocntext,然后对回答原始问题的我的回答进行向下投票。原始问题的背景是关于
未定义。我指出您在forEach回调中使用的是function关键字而不是arrow函数,这就是为什么
这个
引用没有指向组件的原因。虽然您对数组异步请求的使用也是错误的,但它超出了您原始问题的范围,因此我没有基于此编写答案。不,我没有这样做,我没有编辑我的问题,也没有更改主题,向上滚动您将看到duhaime编辑的内容,我猜他在@mxdi9i7上否决了您
 const promises = array.map(item => axios.get(`/http://api.com?keyword=${item}`).then(res => res.data));

 Promise.all(promises).then(stateData => {
   this.setState({ stateData });
 });