我尝试每5分钟调用一次API,但setInterval的限制不允许这样做。
useEffect(() => {
setInterval(() => {
(() => {
const API_KEY = "C5EQJXXXXXXXXXXXX";
const name = "FB";
axios
.get(
`https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=${name}&interval=5min&apikey=${API_KEY}`
)
.then(({ data }) => {
console.log(data);
console.log(data["Time Series (5min)"]);
for (let key in data["Time Series (5min)"]) {
setStocksX((prev) => [...prev, key]);
setStocksY((prev) => [
...prev,
data["Time Series (5min)"][key]["1. open"]
]);
}
//console.log(stocksX, stocksY);
});
})();
}, 30000);
});
任何建议都将不胜感激!感谢
您可以在第一次渲染的useEffect挂钩中添加时间为60*5*1000的setInterval。在卸载组件时需要清除setInterval之后。
const ref = useRef(null)
useEffect(() => {
ref.current = setInterval(yourFunction, 5 * 60 * 1000);
return () => {
if(ref.current){
clearInterval(ref.current)
}
}
}, [])
我写了这个实用程序挂钩,我一直在React应用程序中使用:
import React from 'react';
type IntervalCallback = () => void;
function useDispatch(callback: IntervalCallback, delay: number): void {
const cachedCallback = React.useRef<IntervalCallback>();
React.useEffect(() => {
cachedCallback.current = callback;
}, [callback]);
React.useEffect(() => {
if (delay !== 0) {
const id = setInterval(() => cachedCallback?.current?.(), delay);
return () => clearInterval(id);
}
}, [delay]);
}
export const IntervalHooks = {
useDispatch,
};
然后我可以这样使用它:
IntervalHooks.useDispatch(() => { console.log("hello"); }, 300000);
这给了我很大的灵活性,因为如果需要,我可以动态更新间隔,并在组件卸载时负责清理。
我假设你的钩子每0.5秒声明一个新的setInterval,可能会让你的React应用程序停止以避免内存泄漏,你只需要声明一个setInterval
,这意味着useEffect
的第二个参数应该有空的方括号
useEffect(() => {
setInterval(yourFunction, 300000); // The function will be called
},[]); // every 5 minutes