Javascript 为什么我的状态没有在setInterval和useEffect中的函数内部重置

Javascript 为什么我的状态没有在setInterval和useEffect中的函数内部重置,javascript,reactjs,Javascript,Reactjs,代码: import React,{useState,useffect}来自“React”; 导出默认函数App(){ const[isLoading,setLoading]=useState(true); const[data,setData]=useState([]); useffect(()=>{ getData(); }, []); useffect(()=>{ const inter=setInterval(()=>getData(),1000); }, []); 异步函数getDat

代码:

import React,{useState,useffect}来自“React”;
导出默认函数App(){
const[isLoading,setLoading]=useState(true);
const[data,setData]=useState([]);
useffect(()=>{
getData();
}, []);
useffect(()=>{
const inter=setInterval(()=>getData(),1000);
}, []);
异步函数getData(){
如果(!isLoading){
返回;
}
console.log(isLoading);
常量数据=等待获取('http://localhost:8000/api/todo/')
.然后((res)=>res.json())
。然后((数据)=>数据);
if(Array.isArray(数据)){
setData(数据);
设置加载(假);
}
}
const tododata=data.map((ddd)=>{
返回{ddd.title};
});
如果(孤岛加载){
回装;
}否则{
返回(
{console.log(isLoading)}
{tododata}
);
}
}
代码摘要

这是我真实项目中的简化代码。因此,我有2个
useState
,第一个运行一次,第一次尝试获取数据,第二个的目的是,如果第一个没有获取数据,用户在加载过程中陷入困境,第二个将重复尝试获取数据,如果前端获取数据,它应该停止获取

我的问题


在这段代码中,
getData
函数将以某种方式保持获取,指示
isLoading
为真,但同时组件将呈现
data
状态中的所有标题,指示isLoading为假。为什么会发生这种情况?

我将答案改为
setTimeout
,而不是
setInterval

import React,{useState,useffect}来自“React”;
导出默认函数App(){
const[isLoading,setLoading]=useState(true);
const[data,setData]=useState([]);
useffect(()=>{
getData();
}, []);
异步函数getData(){
如果(!isLoading){
返回;
}
console.log(isLoading);
试一试{
常量数据=等待获取('http://localhost:8000/api/todo/然后((res)=>res.json());
if(Array.isArray(数据)){
setData(数据);
设置加载(假);
}否则{
设置超时(()=>{
getData();
}, 1000);
}
}捕获(e){
设置超时(()=>{
getData();
}, 1000);
}
}
const tododata=data.map((ddd)=>{
返回{ddd.title};
});
如果(孤岛加载){
回装;
}否则{
返回(
{console.log(isLoading)}
{tododata}
);
}
}

“getData函数将以某种方式继续获取”-这也就不足为奇了,因为您有
setInterval(()=>getData(),1000)
,这意味着
getData()
每1000毫秒会被一次又一次地触发。顺便说一句-
。然后((data)=>data)
是毫无意义的,除非您的意思是-
。然后({data}=>data)
@PeterB对不起,我真的不明白。因此,由于
setInterval
的原因,它仍将使用原始的
isLoading
状态,该状态为true且不会更新?我对答案进行了更改,使用
setTimeout
而不是interval。我认为这是一个更好的解决办法。另外,你的错误是Andy mccullough建议的关于执行函数而不是分配函数的错误。@andymcculough我太愚蠢了,无法理解hahaI通过关闭我的REST API进行了测试,这样提取就会失败,在我重新打开后,它没有发出任何请求,我刷新了获取数据的时间。啊,是的,这是因为错误将不会继续与代码后。我将进行更改以包括try/catch。看一看。现在,如果API抛出错误,它应该启动新的调用。您杀死了它。谢谢我帮助的小伙子。干杯