【问题标题】:Should I call clearInterval() before calling setInterval()我应该在调用 setInterval() 之前调用 clearInterval()
【发布时间】:2014-08-07 22:05:24
【问题描述】:

在我们的代码中的几个地方,我们做了这样的事情:

eventGrabber.poller = setInterval(grabEvents, 50);

每 50 毫秒调用一次 grabEvents 方法。但是,由于我们在不止一个地方执行此操作,我想知道grabEvents 是否比每50 毫秒更频繁地调用一次。换句话说,如果我这样做:

eventGrabber.poller = setInterval(grabEvents, 50);
//wait 25 ms here
eventGrabber.poller = setInterval(grabEvents, 50);

现在会不会有两个计时器每 25 毫秒运行一次调用 grabEvents(其中一个我们永远无法停止,因为我们失去了它的句柄)?

将我们所有的调用更改为类似这样的方法是否可以解决这个问题(如果它确实是一个问题):

//if there is a timer running clear it out first
clearInterval(eventGrabber.poller); //if poller is null does it matter??

//now start the timer
eventGrabber.poller = setInterval(grabEvents, 50);

【问题讨论】:

  • 现代浏览器可能会在不再使用间隔时进行垃圾收集,但无论如何手动清除它是个好习惯
  • @adeneo 关键是第一个 setInterval 仍在使用中,即使在您开始第二个之后也是如此。
  • @Christophe - 当然会,但这应该很容易弄清楚 -> jsfiddle.net/adeneo/r38zj6xz
  • @adeneo 那么垃圾收集在这里有什么帮助?

标签: javascript setinterval clearinterval


【解决方案1】:

是的,那时会有两个间隔运行。然而,“句柄”实际上只是一个整数。使用 clearInterval 需要一个数字作为参数,但是,如果传递 NaN、undefined、null 等,它只会默默地失败并继续前进。

我建议筛选轮询器并按照问题末尾的建议将其清除。这可能是最佳做法。

根据您页面上的计时器数量,您可以随时清除每一个计时器。不过,这可能不是所希望的,具体取决于是否存在对页面操作至关重要的活动间隔。

var maxInterval = setInterval(function(){},10000);
for(var i = 0; i <= maxInterval; i++) clearInterval(i);

【讨论】:

  • 这是一个无限循环
  • @Pumbaa80 - 哎呀!你是对的,间隔需要在第一部分阅读。我应该把它分开以便更具可读性。
【解决方案2】:

是的,您将运行多个间隔,如果您将其封装并执行以下操作会怎样:

function poller(callback, ms) {
    var interval
    return {
        start: function() {
            if (!interval) {
                interval = setInterval(callback, ms)
            }
        },
        stop: function() {
            clearInterval(interval)
        }
    }
}

eventGrabber.poller = poller(grabEvents, 50)
eventGrabber.poller.start()
// ......
eventGrabber.poller.start()

这样你就可以确保它不会运行多次:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-12
    • 2013-01-02
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多