开发者问题收集

每分钟刷新从 API 收到的数据 React, Javascript

2020-10-15
6756

我正在做一个小项目,涉及获取不同地点的天气,以及随后动态获取这些地点的时间。所有这些都运行良好,但后来我尝试更进一步,尝试每分钟刷新从 API 获取的数据(无需重新提交/按回车键)。 我尝试了各种方法将 setinterval 函数实现到代码中,但似乎都不起作用。代码如下所示:

function App() {
    const [query, setQuery] = useState("");
    const [weather, setWeather] = useState({});
    const [timeZone, setTimeZone] = useState({});

    const handleChange = (e) => {
        setQuery(e.target.value);
    };
    const apiCall = () => {
        Axios({
            method: "get",
            url: `${api.timeBase}apiKey=${api.timeKey}&location=${query}`,
            timeout: 10000, 
        })
            .then((res) => {
                console.log(res.data);
                setWeather(res.data);
                //setQuery("");
            })
            .catch((err) => {
                console.log(err);
            });
    };

    const handleSubmit = (e) => {
        e.preventDefault();
        apiCall();
    };
    useEffect(() => {
        setInterval(apiCall, 60000);
    }, []);

    useEffect(() => {
        if (weather.main !== undefined) {
            Axios.get(
                `${api.timeBase}apiKey=${api.timeKey}&location=${weather.name}, ${weather.sys.country}`
            )
                .then((res) => {
                    console.log(res.data);
                    setTimeZone(res.data);
                })
                .catch((err) => {
                    console.log(err);
                });
        }
    }, [weather]);

基本上,我遇到最多的问题是,在 setinterval 函数中的某个地方, query 参数被清除,API 继续检索不同的位置,直到恢复正常。我尝试阻止 query 参数在更新状态后清除,但没有帮助。

PS:我不得不分解 handlesubmit ,因为将 setinterval 附加到原始代码块会引发错误,因为 e.preventDefault 未定义。此外,我认为在没有 useEffect 的情况下调用 setInterval 也会使情况变得更糟。

1个回答

间隔结束后清除间隔。 setInterval 函数返回一个 timerId ,应将其清除,否则,它将保留在计时器池中,即使在回调实例运行后仍可执行。

React.useEffect(() => {
   const id = setInterval(apiCall, 60000);
   return () => clearInterval(id);
}, []);
Prateek Thapa
2020-10-15