, поэтому я выбираю некоторые данные из двух URL-адресов по порядку и сохраняю ответные данные в массив, а затем устанавливаю состояние этого массива. Когда я console.log (dataArray), я могу видеть содержимое, но console.log (dataArray.length) равен 0, независимо от того, проверяю я это сразу после оператора setState или в методе render. Что я должен сделать, чтобы установить состояние для массива, прежде чем он будет отображаться снова? Спасибо !!!
class App extends Component {
state={
dataArray:[]
};
componentDidMount(){
this.getTrainInfo();
}
getTrainInfo=()=>{
let arr=[];
let data={};
fetch('https://api-v3.mbta.com/predictions?filter[stop]=South+Station,North+Station&filter[direction_id]=0&include=vehicle&sort=departure_time')
.then(response=>response.json())
.then(res=> {
res.data.map(dat => {
data.departureTime = dat.attributes.departure_time;
data.boardingStaus = dat.attributes.status;
data.trainID = dat.relationships.route.data.id;
return data;
})
.forEach(data=>{
fetch('https://api-v3.mbta.com/routes/' + data.trainID)
.then(response2 => response2.json())
.then(res2 => {
data.destination = res2.data.attributes.direction_destinations[0];
arr.push(data);
//setState here work, but set too many times
//this.setState({dataArray:arr})
})
});
})
.then( ()=>{
this.setState({dataArray:arr});
console.log(this.state.dataArray); //log an array full of objects.
console.log(this.state.dataArray.length); //but here length is 0.
})
};
render() {
let data=this.state.dataArray;
let departureTime;
let boardingStatus;
let TrackNo;
let destination;
console.log(data); //log the array full of objects.
console.log(data.length); //but here the length is 0.
if(data.length){
departureTime=new Date(data[0].departureTime).toLocaleString('en-US',{hour:'numeric',minute:'numeric', hour12:true});
boardingStatus= data[0].boardingStaus;
TrackNo=(data[0].trackNo)?data[0].trackNo:0;
destination=data[0].destination;
}
return (
<div className="App">
<h1>Train info</h1>
<h2>{departureTime}
{boardingStatus}
{TrackNo}
{destination}
</h2>
</div>
);
}
}