定时器仅通过空赋值而不是clearTimeout()来销毁

问题描述 投票:1回答:2

我试图通过clearTimeout()摧毁前一个计时器来弄清楚为什么我的简单油门功能无法正常工作。它只是不起作用,只有null任务让我从这个陷阱...

知道为什么吗?谢谢

码:

const throttler = ({ event, callback, delay, target }) => {
  let timerID = null
  const eventSubscribeTarget = target || window

  const resizeThrottler = () => {
    if (timerID) return

    timerID = setTimeout(() => {
      callback()
      timerID = null // <= only by null assigment it's gonna gone...
      // clearTimeout(timerID) doesn't work here
    }, delay)
  }

  eventSubscribeTarget.addEventListener(event, resizeThrottler, false)
}
javascript timer settimeout setinterval clearinterval
2个回答
0
投票

setTimeout()的结果总是返回Number。此数字表示已设置的计时器的ID值。将此值与clearTimeout()方法一起使用可取消计时器。

clearTimeout函数不会重置数字,这就是当你想重用这个变量时你必须将timerID设置为null的原因。

https://www.w3schools.com/jsref/met_win_settimeout.asp https://www.w3schools.com/jsref/met_win_cleartimeout.asp


0
投票

clearTimeout - clearInterval mixup旁边......)这里:

    if (timerID) return

因此,将timerId值设置为null将导致此处提前返回,不会设置新的超时。我猜想,正是我们所追求的。

    timerID = setTimeout(() => {
      callback()
      timerID = null // <= only by null assigment it's gonna gone...
      // clearTimeout(timerID) doesn't work here

在这里,clearTimeout不会做任何事情 - 超时已经打勾,回调已被调用,实际上不再需要超时清除。该功能正在此处执行,不会再次执行。如果我们想要阻止设置新的超时,那么这个

    timerID = setTimeout(() => {

是无法执行的行。

© www.soinside.com 2019 - 2024. All rights reserved.