为什么我的提取请求在很短的时间内给我很多错误

Why is my fetch request giving me a lot of error in a very short amount of time

所以我每次加载页面时都必须进行一次获取调用,并且页面将保持加载状态,直到获取数据为止。所以我在一个单独的文件上创建了一个函数,该函数有 3 个参数(link,数据的 setState,加载的 setState),函数看起来像这样:

        async function fetchingObj(link, dataFunc, loadingFunc){

    const headers = {
        'Content-Type': 'application/json',
        'Authorization': `JWT ${localStorage.getItem('access')}`
    }

    try{

        let data = await fetch(link, { headers }).then(data => data.json())

        if(typeof data === "object" || typeof data === "string"){
           
            dataFunc(data)
            loadingFunc(false)
        }

        else{
            setTimeout( fetchingObj(), 1500 )
            console.log('from else', data);
        }
    }
    
    catch(err){
        setTimeout( fetchingObj(), 1500 )
    }
}

然后我将它导入我的页面并在我的 useEffect

中调用它
useEffect(() =>{
    fetchingObj(process.env.REACT_APP_API_URL + `/api/polls/${parameters.num}/`, setPoll, setLOading)
    //eslint-disable-next-line react-hooks/exhaustive-deps
}, [])

所以此功能的目的是,如果我的服务器出现故障,页面将保持加载状态并每 1.5 秒重新获取一次,直到我的服务器恢复正常 运行。然而,当我通过关闭我的服务器来测试它时,我得到了像这样的每秒 100 次错误 当我的服务器重新启动时,我仍然需要刷新,为什么会这样?

非常感谢

正如 ReactJS 在 Github issue 中正式宣布的那样,它不会像您所写的那样工作。

尝试关注

useEffect(() => {
  async function fetchingObj(link, dataFunc, loadingFunc) {
    const headers = {
      "Content-Type": "application/json",
      Authorization: `JWT ${localStorage.getItem("access")}`,
    };

    try {
      let data = await fetch(link, { headers }).then((data) => data.json());

      if (typeof data === "object" || typeof data === "string") {
        dataFunc(data);
        loadingFunc(false);
      } else {
        setTimeout(fetchingObj(), 1500);
        console.log("from else", data);
      }
    } catch (err) {
      setTimeout(fetchingObj(), 1500);
    }
  }

  fetchingObj(
    process.env.REACT_APP_API_URL + `/api/polls/${parameters.num}/`,
    setPoll,
    setLOading,
  );
}, []);

问题是您对 setTimeout 的调用 - 您是立即调用函数,而不是在 1500 毫秒后将函数排队到 运行。

setTimeout( fetchingObj(), 1500 )

这应该是-

setTimeout(fetchingObj, 1500);

或者理想情况下,您应该使用相同的参数调用它(我猜是吧?)-

setTimeout(() => fetchingObj(link, dataFunc, loadingFunc), 1500)

Here's a stackblitz that shows the problem and the solution.