当前位置: 首页 > 知识库问答 >
问题:

使用Context API和React Hooks每隔几秒钟执行一次API调用

苏鹏鹍
2023-03-14

使用React中的上下文API时,是否可以每隔几秒钟设置一次自动刷新间隔?getData()函数在API上运行axios.get(),但当我在useEffect钩子的返回函数中尝试setInterval()和cleanup时,它仍然不会清理间隔。getData()将当前变量和加载变量设置为应用程序级状态。

我只是想每隔几秒钟刷新并重新执行API调用。我尝试使用useRef()钩子,并使它开始工作,但一旦完成,useffect仍然无法清除间隔。

我想访问组件返回函数中的当前属性,并在每次运行API调用时显示一些数据。

代码如下:

const { loading, current, getData } = appContext;
  useEffect(() => {
    const interval = setInterval(() => {
      getData();
      console.log('updated');
    }, 1000);

    return () => clearInterval(interval);
  }, []); // eslint-disable-line // also tried without the []

getData()代码:

const getData = async () => {
    setLoading();

    const res = await axios.get(process.env.REACT_APP_APIT);

    dispatch({ type: GET_CURRENT, payload: res.data });
  };

共有1个答案

长孙逸仙
2023-03-14

我有一个类似的问题,我使用这里描述的解决方案:https://overreacted.io/making-setinterval-declarative-with-react-hooks/

下面是一个简单的例子:

import React, { useEffect, useRef, useState } from "react";
import ReactDOM from "react-dom";
import "./styles.css";

const useInterval = (callback, delay) => {
  const savedCallback = useRef();

  // Remember the latest callback.
  useEffect(() => {
    savedCallback.current = callback;
  }, [callback]);

  // Set up the interval.
  useEffect(() => {
    function tick() {
      savedCallback.current();
    }
    if (delay !== null) {
      let id = setInterval(tick, delay);
      return () => clearInterval(id);
    }
  }, [delay]);
}

function App() {
  const [intervalTime, setIntervalTime] = useState(2000);

  useInterval(() => {
    // Do some API call here
    setTimeout(() => {
      console.log('API call');
    }, 500);
  }, intervalTime);

  return (
    <div className="App">
      <button onClick={() => setIntervalTime(2000)}>Set interval to 2 seconds</button>
      <button onClick={() => setIntervalTime(null)}>Stop interval</button>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

使用状态变量intervalTime可以控制间隔时间。通过将其设置为null,间隔将停止运行。

 类似资料:
  • 问题内容: 我在Django中的应用程序 可以 创建一些 非常大的SQL查询。我目前使用一个对象,作为我需要的数据,然后使用一个,以返回要显示给用户的内容。 显然,我可以让用户等待一分钟,同时正在执行这些许多查询集并从数据库中提取查询,然后返回此单一HTML页面。 理想情况下,我想在需要时更新页面,例如: 这可能吗? 问题答案: 我最近发现HttpResponse可以是生成器: 这将逐步将结果返回

  • 问题内容: 我想尝试通过以下方式使用@Schedule批注: 根据日志,CronService运行良好,但是计划的任务“ runsEveryMinute”不起作用。 使用EJB计划任务如何工作? 问题答案: 按照该Javadoc中的注释,默认值是: 除小时,分钟和秒外的所有字段;和 默认情况下为小时,分钟和秒。 通过将小时值保留为默认值,它要求计时器在午夜之后每分钟运行一小时(即00:00、00:

  • 问题内容: 我正在cronjob中运行PHP脚本,我想每5分钟发送一封电子邮件 我当前的(crontab)cronjob: cronmail.php如下: 但是我没有在30分钟内收到此配置的电子邮件。 问题答案: 在文件中,这些字段是: 每小时的分钟。 一天中的小时。 一个月中的某天。 一年中的月份。 一周中的天。 所以: 表示每小时10分钟执行一次。 如果您希望每五分钟使用一次,请使用以下任一方

  • 问题内容: 如何每分钟运行一个函数?在JavaScript中,我可以做类似的事情,在Swift中是否存在类似的事情? 想要的输出: 你好世界每分钟一次… 问题答案: 记住要导入基金会。 斯威夫特4:

  • 问题内容: 我有一个ajax调用到一个php文件。我正在收到结果。现在,我正在研究是否有可能使ajax请求每1秒自动执行一次。我将结果发布到名为的输入字段中。如何每三秒钟执行一次ajax调用而不必调用该函数? 问题答案: 您可能要考虑的是服务器发送事件(SSE) 这是一种HTML5技术,JavaScript可以通过该技术“ 长期轮询 ”服务器端点(您的PHP文件)以查看是否发生了任何更改。长轮询基

  • 我有一个定制的Apache Camel组件,它由一个从DefaultConsumer扩展而来的Consumer和没有Producer组成。 我有一个Spring Boot应用程序,与其他几个骆驼路线,都工作得很好。 这在第一次工作,但当下一次触发作业时,它会尝试启动已经运行的路由。 我希望避免修改自定义组件以从DefaultScheduledPollConsumer扩展,因为它并不总是按计划使用。