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

时间:2014-08-07 22:05:24

标签: javascript setinterval clearinterval

在我们代码的几个地方,我们做了类似的事情:

eventGrabber.poller = setInterval(grabEvents, 50);

每隔50 ms调用一次grabEvents方法。但是,由于我们在不止一个地方这样做,我想知道是否每隔50ms更频繁地调用一次getEvents。换句话说,如果我这样做:

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

2 个答案:

答案 0 :(得分:2)

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

我建议您根据问题结尾的建议筛选轮询并清除它。这可能是最好的做法。

根据您在网页上显示的计时器数量,您可以随时清除其中的每个计时器。尽管如此,这可能并不理想,具体取决于是否存在对页面操作至关重要的活动间隔。

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

答案 1 :(得分:1)

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

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

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