react-native - setinterval 函数无限运行
问题描述
const interval = setInterval(() => {
fire.database().ref().child(getpath())
.once("value",
(snapshot) => {
let item = snapshot.val()
console.log(item)
if (item !== null) {
let array = [];
Object.
keys(item)
.forEach(i => array.push(item[i]));
setCard1(array);
}
console.log(item, "item")
if (item !== null) {
itemlen = 7 //length of object I get from valid result
//stop polling for results
console.log(itemlen, "should clear")
}
else {
console.log("polling")
}
})
}, 1000)
console.log("comingout")
if (itemlen !== 0) {
console.log("goingIn")
clearInterval(interval);
}
}, [prefVar]);
预计 clearinterval 会停止 setinterval 函数,但它正在持续运行并且不停止 itemlen 正在获得非零值。有没有更好的方法来实现这个?一旦我从 db 获得有效值,我想停止 useEffect。我在 for setinterval 中的代码选择一个随机路径并检索该路径唯一的问题是有时路径是空的,因此使用 setInterval
解决方案
我将创建两个状态项,一个保持间隔,另一个存储itemlen
,并使用另一个useEffect
来监听对 的更改itemlen
,当它不为 0 时,间隔应该清除。另外,我会检查在你开始另一个间隔之前是否有另一个间隔运行。
const [itemlen, setItemlen] = useState(0);
const [pollingInterval, setPollingInterval] = useState(null);
useEffect(() => {
if (pollingInterval === null) {
setPollingInterval(setInterval(() => {
fire.database().ref().child(getpath())
.once("value",
(snapshot) => {
let item = snapshot.val()
console.log(item)
if (item !== null) {
let array = [];
Object.
keys(item)
.forEach(i => array.push(item[i]));
setCard1(array);
}
console.log(item, "item")
if (item !== null) {
setItemlen(7);
console.log("should clear")
} else {
console.log("polling")
}
})
}, 1000));
}
}, [prefVar]);
useEffect(() => {
if (itemlen !== 0 && pollingInterval !== null) {
clearInterval(pollingInterval);
setPollingInterval(null);
}
}, [itemlen])
推荐阅读
- python - 在 python pytube 中获取 youtube 视频分辨率
- html - 如何在html中并排创建两张翻转卡
- firebase - Firebase 集合中的数据需要多长时间才能开始导出到 BigQuery?
- jquery - 扩展 Accordion 选项
- sql - SQL 连接和聚合函数
- html - 锚标记禁用颜色属性不起作用?
- scala - 如何更改两级模式树中字段的数据类型?
- tensorflow - 无法在 Spyder 中导入张量流
- javascript - 使用静音命令 discord.js 时缺少权限错误
- python - 使用 matplotlib 绘制时间和值