避免 setInterval 被清除
Avoid setInterval from being Cleared
我的网站上有一个简单的时钟组件,代码如下:
import { useEffect, useState } from 'react'
const Clock = () => {
const [time, setTime] = useState()
useEffect(() => {
setInterval(() => {
const dateObject = new Date() //` Date Object
var currentTime = dateObject.getHours() + ' : ' + dateObject.getMinutes()
setTime(currentTime)
}, 1000)
}, [])
return <div>{time}</div>
}
export default Clock
但在其他一些页面上,我有一个 运行 循环来清除该特定页面上的超时,但最终发生的是我的时钟间隔也被清除了。
(为我想要的功能清除该页面上的超时非常重要,这会清除当前 运行 的所有超时。)
代码为:
const highestId = window.setTimeout(() => {
for (let i = highestId; i >= 0; i--) {
window.clearTimeout(i)
}
}, 0)
我想保留时钟间隔 运行 但同时取消所有其他间隔。
您可以跟踪 setTimeout
个 ID 或 setInterval
个 ID,然后只清除超时 ID。
/* Make sure the timeoutIDs doesn't get reinitialised everytime you run this code,
probably store it some central service that remains in memory, or declare it globally
*/
const timeoutIDs = [];
const id = window.setTimeout(() => {
for (let i = 0; i < timeoutIDs.length; i++) {
window.clearTimeout(timeoutIDs[i])
}
}, 0);
timeoutIDs.push(id)
或:
import { useEffect, useState } from 'react'
export const IntervalSet = new Set();
const Clock = () => {
const [time, setTime] = useState()
useEffect(() => {
const id = setInterval(() => {
const dateObject = new Date() //` Date Object
var currentTime = dateObject.getHours() + ' : ' + dateObject.getMinutes()
setTime(currentTime)
}, 1000)
set.add(id);
}, [])
return <div>{time}</div>
}
export default Clock;
import { IntervalSet } from 'somePath';
const highestId = window.setTimeout(() => {
for (let i = highestId; i >= 0; i--) {
if(IntervalSet.has(i)) {
continue;
}
window.clearTimeout(i)
}
}, 0)
我的网站上有一个简单的时钟组件,代码如下:
import { useEffect, useState } from 'react'
const Clock = () => {
const [time, setTime] = useState()
useEffect(() => {
setInterval(() => {
const dateObject = new Date() //` Date Object
var currentTime = dateObject.getHours() + ' : ' + dateObject.getMinutes()
setTime(currentTime)
}, 1000)
}, [])
return <div>{time}</div>
}
export default Clock
但在其他一些页面上,我有一个 运行 循环来清除该特定页面上的超时,但最终发生的是我的时钟间隔也被清除了。
(为我想要的功能清除该页面上的超时非常重要,这会清除当前 运行 的所有超时。)
代码为:
const highestId = window.setTimeout(() => {
for (let i = highestId; i >= 0; i--) {
window.clearTimeout(i)
}
}, 0)
我想保留时钟间隔 运行 但同时取消所有其他间隔。
您可以跟踪 setTimeout
个 ID 或 setInterval
个 ID,然后只清除超时 ID。
/* Make sure the timeoutIDs doesn't get reinitialised everytime you run this code,
probably store it some central service that remains in memory, or declare it globally
*/
const timeoutIDs = [];
const id = window.setTimeout(() => {
for (let i = 0; i < timeoutIDs.length; i++) {
window.clearTimeout(timeoutIDs[i])
}
}, 0);
timeoutIDs.push(id)
或:
import { useEffect, useState } from 'react'
export const IntervalSet = new Set();
const Clock = () => {
const [time, setTime] = useState()
useEffect(() => {
const id = setInterval(() => {
const dateObject = new Date() //` Date Object
var currentTime = dateObject.getHours() + ' : ' + dateObject.getMinutes()
setTime(currentTime)
}, 1000)
set.add(id);
}, [])
return <div>{time}</div>
}
export default Clock;
import { IntervalSet } from 'somePath';
const highestId = window.setTimeout(() => {
for (let i = highestId; i >= 0; i--) {
if(IntervalSet.has(i)) {
continue;
}
window.clearTimeout(i)
}
}, 0)