如何强制清除Javascript中的间隔

时间:2019-01-02 21:48:59

标签: javascript

全部:

我想知道是否有一种方法可以强制清除所有间隔计数器,例如:

/* var counter = */ setInterval(function(){console.log("Tick")}, 1000)

但是我忘记获取引用(那个counter变量,如果在控制台中打印出来就是一个数字),我想知道是否有一种方法可以找到Interval是什么数字,所以我可以调用clearInterval

2 个答案:

答案 0 :(得分:3)

您唯一可以确定的id是整数,该整数将大于零。参见the spec

  

let handle是用户代理定义的一个大于零的整数,它将标识活动计时器列表中此调用要设置的超时。

因此,您可以非常低效地尝试所有方法:

for (let i = 1; i < Number.MAX_SAFE_INTEGER; i++) {
    clearInterval(i);
}

请注意,这将需要一段时间(有很多数字需要循环,尽管您可能会假设浏览器将按顺序发布它们,并且您生成的数字永远不会超过一定数量)。

请注意(See MDN):

  

setInterval()和setTimeout()使用的ID池是共享的,这意味着您可以在技术上互换使用clearInterval()和clearTimeout()

因此,这将对所有setTimeout调用以及所有setInterval调用进行平放。

答案 1 :(得分:1)

我不喜欢的另一种选择是猴子补丁setInterval。基本上,装饰它的方式是将setInterval的引用存储在其他位置。

allIntervals = []
originalSetInterval = window.setInterval
window.setInterval = (...args) => {
    const interval = originalSetInterval(...args)
    allIntervals.push(interval)
    return interval
}

// ...
setInterval(function(){console.log("Tick")}, 1000)
setInterval(function(){console.log("Tick 2")}, 1000)

然后只需将它们全部清除即可

allIntervals.map(window.clearInterval)

您可能还想覆盖window.clearInterval,然后从allIntervals弹出正确的值。