全部:
我想知道是否有一种方法可以强制清除所有间隔计数器,例如:
/* var counter = */ setInterval(function(){console.log("Tick")}, 1000)
但是我忘记获取引用(那个counter
变量,如果在控制台中打印出来就是一个数字),我想知道是否有一种方法可以找到Interval是什么数字,所以我可以调用clearInterval
答案 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
弹出正确的值。