在JavaScript中查看所有超时/间隔?

我正在编写一个利用JavaScript超时和间隔来更新页面的应用程序。 有没有办法看到有多less间隔设置? 我想确保我不会意外地通过设置数百个间隔来杀死浏览器。

这甚至是一个问题?

我不认为有枚举活动计时器的方法,但是你可以重写window.setTimeout和window.clearTimeout,并用你自己的实现replace它们来做一些跟踪,然后调用原件。

window.originalSetTimeout=window.setTimeout; window.originalClearTimeout=window.clearTimeout; window.activeTimers=0; window.setTimeout=function(func,delay) { window.activeTimers++; return window.originalSetTimeout(func,delay); }; window.clearTimeout=function(timerID) { window.activeTimers--; window.originalClearTimeout(timerID); }; 

当然,你可能不总是调用clearTimeout,但是这至less会给你一些方法来跟踪运行时发生的事情。

我做了一个显示所有间隔的Chrome开发工具扩展。 清除的是灰色的。

定时器Chrome Devtool扩展

setInterval的嗅探

看到保罗只覆盖setTimeout我想我会分享一个计数器setInterval / clearInterval。

 window.originalSetInterval = window.setInterval; window.originalClearInterval = window.clearInterval; window.activeIntervals = 0; window.setInterval = function (func, delay) { if(func && delay){ window.activeIntervals++; } return window.originalSetInterval(func,delay); }; window.clearInterval = function (intervalId) { // JQuery sometimes hands in true which doesn't count if(intervalId !== true){ window.activeIntervals--; } return window.originalClearInterval(intervalId); }; 

而不是只有一些计时器,这里是一个实现将所有timerid存储到一个数组中。 它只显示活动计时器,而接受的答案只计算对setTimeoutclearTimeout调用。

 (function(w) { var oldST = w.setTimeout; var oldSI = w.setInterval; var oldCI = w.clearInterval; var timers = []; w.timers = timers; w.setTimeout = function(fn, delay) { var id = oldST(function() { fn && fn(); removeTimer(id); }, delay); timers.push(id); return id; }; w.setInterval = function(fn, delay) { var id = oldSI(fn, delay); timers.push(id); return id; }; w.clearInterval = function(id) { oldCI(id); removeTimer(id); }; w.clearTimeout = w.clearInterval; function removeTimer(id) { var index = timers.indexOf(id); if (index >= 0) timers.splice(index, 1); } }(window)); 

这是如何获得页面上的活动计时器计数

 timers.length; 

这是如何删除所有活动的计时器

 for(var i = timers.length; i--;) clearInterval(timers[i]); 

已知的限制:

  • 你只能通过一个函数(而不是一个string) setTimeout这个猴子补丁。
  • 该函数假设clearIntervalclearTimeout执行相同的操作,但它可以在将来更改。

我们刚刚发布了一个解决这个问题的软件包。

 npm install time-events-manager 

有了这个,你可以通过timeoutCollection对象来查看和pipe理它们(通过timeoutCollection对象和javascript的间隔)。