为什么 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)
}