Javascript 在异步循环中设置useState挂钩
我对reactJs很陌生 我试图在异步循环中连接结果,但出现了一些问题。 setState未正确保存,当我打印它时,我可以看到它是一个空数组,我认为这是因为异步调用中存在 我怎样才能解决这个问题?请推荐我Javascript 在异步循环中设置useState挂钩,javascript,reactjs,asynchronous,react-hooks,Javascript,Reactjs,Asynchronous,React Hooks,我对reactJs很陌生 我试图在异步循环中连接结果,但出现了一些问题。 setState未正确保存,当我打印它时,我可以看到它是一个空数组,我认为这是因为异步调用中存在 我怎样才能解决这个问题?请推荐我 function App() { const [data, setData] = useState({data:[]}); const handleChildSubmit = (data) => { setData(data); } return (
function App() {
const [data, setData] = useState({data:[]});
const handleChildSubmit = (data) => {
setData(data);
}
return (
<div>
<Form onChildSubmit={handleChildSubmit} />
<Results flights={data} />
</div>
);
}
const Form = ( {onChildSubmit} ) => {
const [dati, setDati] = useState([]);
const onFormSubmit = async (e) => {
e.preventDefault();
// Flights search Parameters
const data = new FormData(e.target);
const dateFrom = data.get('dateFrom');
const dateTo = data.get('dateTo');
const departureDay = data.get('day');
const placeFrom = data.get('placeFrom');
const placeTo = data.get('placeTo');
let dayDeparture;
const daysDeparture = getDayOfWeekArray(dateFrom,dateTo,departureDay);
// Loop of Fly Search in range time
for(let i=0; i < daysDeparture.length; i++){
dayDeparture = daysDeparture[i];
axios.get('https://api.skypicker.com/flights?flyFrom='+placeFrom+'&to='+placeTo+'&dateFrom='+dayDeparture+'&dateTo='+dayDeparture+'&partner=picky')
.then(res => {
setDati([...dati, res.data]);
onChildSubmit(dati);
})
.catch(function (error) {
console.log('error: '+error);
})
.finally(function () {
});
}
}
函数应用程序(){
const[data,setData]=useState({data:[]});
常量handleChildSubmit=(数据)=>{
setData(数据);
}
返回(
);
}
常量形式=({onChildSubmit})=>{
const[dati,setDati]=useState([]);
const onFormSubmit=async(e)=>{
e、 预防默认值();
//航班搜索参数
常数数据=新的FormData(如目标);
const dateFrom=data.get('dateFrom');
const dateTo=data.get('dateTo');
const departureDay=data.get('day');
const placeFrom=data.get('placeFrom');
const placeTo=data.get('placeTo');
让我们离开;
const daysDeparture=getDayOfWeekArray(dateFrom、dateTo、departureDay);
//范围时间内的飞行搜索循环
for(设i=0;i{
setDati([…dati,res.data]);
onChildSubmit(dati);
})
.catch(函数(错误){
console.log('错误:'+错误);
})
.最后(函数(){
});
}
}
问题在于useState
这里为您提供了带有特定值的dati
变量。然后您的异步工作发生,并且setDati()
被多次调用,但是dati
在重新呈现表单,然后再次调用onFormSubmit
之前不会更改
你有几个选择
只能将结果作为数组添加一次
const results = []
for(let i=0; i < daysDeparture.length; i++){
dayDeparture = daysDeparture[i];
const res = await axios.get('https://api.skypicker.com/flights?flyFrom='+placeFrom+'&to='+placeTo+'&dateFrom='+dayDeparture+'&dateTo='+dayDeparture+'&partner=picky');
results.push(res.data);
}
// Add all results when all are fetched.
setDati([...dati, ...results])
useState提供了一种在更新时使用前一个状态的方法(就像使用类组件时的回调方法),可以对此进行尝试
.then(res => {
setDati(prevDati => ([...prevDati, res.data]));
onChildSubmit(dati);
})
另一方面,您的
async
函数没有await
表达式。您可以使用then()
来解决您的承诺。
.then(res => {
setDati(prevDati => ([...prevDati, res.data]));
onChildSubmit(dati);
})