为什么 setInterval 不能正常工作?
Why setInterval does not work correactly?
我正在尝试制作秒表 (00:00:00:00)。但是我的一秒比真正的一秒慢。
我还将 setInterval 10 的值更改为 1 但没有任何变化。当我把它改成 100 时,它起作用了,时间流得更慢了。
(00:00:00:00)=(hh:mm:ss:ms)
这是我的代码的一部分:
const [time, setTime] = useState({
ms: 0,
ss: 0,
mm: 0,
hh: 0
})
let degisenMs = time.ms,
degisenH = time.hh,
degisenM = time.mm,
degisenS = time.ss;
const run = () => {
if (updatedMs === 100) {
updatedS++;
updatedMs = 0
}
if (updatedS === 60) {
updatedM++;
updatedS = 0;
}
if (M === 60) {
updatedH++;
updatedM = 0
}
updatedMs++;
return (setTime({
ms: updatedMs,
ss: updatedS,
mm: updatedM,
hh: updatedH
}))
}
const start = () => {
setStatus(1)
run()
setInterv(setInterval(run, 10))
}
问题是 setInterval
不准确,是 approximate。一种选择是使用网络工作者来提高准确性,如 link 中所述,但它仍然不准确。
在测量时间时,最好跟踪 start
时间戳并计算出每个 tick/update 已经过去了多少时间。然后您可以更新 UI 或触发警报等。这是一些伪代码。
const [ startTime, setStartTime ] = useState(null)
const [ intervalId, setIntervalId ] = useState(null)
function tick() {
const now = new Date()
const elapsedMs = now - startTime
// Update UI etc using elapsedMs
}
function start() {
setStartTime(new Date())
// Run tick() every 100ms
setIntervalId(setInterval(tick, 100))
}
function stop() {
clearInterval(intervalId)
}
我正在尝试制作秒表 (00:00:00:00)。但是我的一秒比真正的一秒慢。 我还将 setInterval 10 的值更改为 1 但没有任何变化。当我把它改成 100 时,它起作用了,时间流得更慢了。 (00:00:00:00)=(hh:mm:ss:ms) 这是我的代码的一部分:
const [time, setTime] = useState({
ms: 0,
ss: 0,
mm: 0,
hh: 0
})
let degisenMs = time.ms,
degisenH = time.hh,
degisenM = time.mm,
degisenS = time.ss;
const run = () => {
if (updatedMs === 100) {
updatedS++;
updatedMs = 0
}
if (updatedS === 60) {
updatedM++;
updatedS = 0;
}
if (M === 60) {
updatedH++;
updatedM = 0
}
updatedMs++;
return (setTime({
ms: updatedMs,
ss: updatedS,
mm: updatedM,
hh: updatedH
}))
}
const start = () => {
setStatus(1)
run()
setInterv(setInterval(run, 10))
}
问题是 setInterval
不准确,是 approximate。一种选择是使用网络工作者来提高准确性,如 link 中所述,但它仍然不准确。
在测量时间时,最好跟踪 start
时间戳并计算出每个 tick/update 已经过去了多少时间。然后您可以更新 UI 或触发警报等。这是一些伪代码。
const [ startTime, setStartTime ] = useState(null)
const [ intervalId, setIntervalId ] = useState(null)
function tick() {
const now = new Date()
const elapsedMs = now - startTime
// Update UI etc using elapsedMs
}
function start() {
setStartTime(new Date())
// Run tick() every 100ms
setIntervalId(setInterval(tick, 100))
}
function stop() {
clearInterval(intervalId)
}