我应该在调用setInterval()之前调用clearInterval()吗?

Should I call clearInterval() before calling setInterval()

本文关键字:调用 clearInterval 我应该 setInterval      更新时间:2023-09-26

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

eventGrabber.poller = setInterval(grabEvents, 50);

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

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

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

把我们所有的调用都改成这样能解决这个问题吗(如果这真的是个问题的话):

//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);

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

我建议对民意调查者进行筛选,并按照你问题末尾的建议清除它。这可能是最佳实践。

根据你页面上有多少计时器,你可以把它们全部清除。但是,这可能并不理想,这取决于是否存在对页面操作至关重要的活动间隔。

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

是的,你会有多个间隔运行,如果你封装它并做这样的事情:

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()

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