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

这还是一个问题吗?

有帮助吗?

解决方案

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

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,但这至少给你一些方法来跟踪什么是在运行时发生的事情。

其他提示

我由铬DevTools扩展,显示所有的间隔。清除那些是灰色的。

“定时器铬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);
};

这里不仅仅是一个计时器计数,而是一个将所有计时器存储到一个数组中的实现。它仅显示 活动定时器 而接受的答案只计算调用 setTimeout & clearTimeout.

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

已知限制:

  • 您只能将函数(而不是字符串)传递给 setTimeout 有了这个猴子补丁。
  • 该函数假设 clearIntervalclearTimeout 他们也这样做,但将来可能会改变。

我们只需公布一揽子解决这一确切的问题。

npm install time-events-manager

使用的是,可以查看和经由timeoutCollection对象管理它们(和JavaScript的间隔viaintervalCollection对象)。

timeoutCollection.getScheduled(); timeoutCollection.getCompleted(); timeoutCollection.getAll();

我只是需要这样的事情,这就是我已经把:

window.setInterval = function (window, setInterval) {
    if (!window.timers) {
        window.timers = {};
    }
    if (!window.timers.intervals) {
        window.timers.intervals = {};
    }
    if (!window.timers.intervals.active) {
        window.timers.intervals.active = {};
    }
    return function (func, interval) {
        var id = setInterval(func, interval);
        window.timers.intervals.active[id] = func;
        return id;
    }
}(window, window.setInterval);

window.clearInterval = function (window, clearInterval) {
    if (!window.timers) {
        window.timers = {};
    }
    if (!window.timers.intervals) {
        window.timers.intervals = {};
    }
    if (!window.timers.intervals.inactive) {
        window.timers.intervals.inactive = {};
    }
    return function (id) {
        if (window.timers.intervals.active && window.timers.intervals.active[id]) {
            window.timers.intervals.inactive[id] = window.timers.intervals.active[id];
            clearInterval(id);
            delete window.timers.intervals.active[id];
        }
    }
}(window, window.clearInterval);

此记录间隔IDS与它们的功能一起,并且还保持其状态轨道(有效/无效)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top