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

IT技术 javascript timeout setinterval
2021-01-29 07:12:20

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

这甚至是一个问题吗?

6个回答

我不认为有一种方法来枚举活动的定时器,但是你可以重写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,但这至少会给您一些方法来跟踪运行时发生的事情。

这个答案将不再适用,因为与 DOM 相关的 JavaScript 函数将是“不可变的”。
2021-03-15 07:12:20
今天笔者在一些代码中使用这个,但我需要activeTimers递减的时候clearTimeout不是叫。这很容易通过用这个替换第二行来实现window.setTimeoutreturn window.originalSetTimeout(function() {func(); activeTimers--;},delay);
2021-04-08 07:12:20

我制作了一个显示所有间隔的 Chrome DevTools 扩展。清除的会变灰。

计时器 Chrome Devtool 扩展

setInterval-嗅探器

可悲的是,这似乎已停止与 Chrome 一起使用。
2021-03-21 07:12:20
@JosephLennox 这个替代方案有效,刚刚测试过:chrome.google.com/webstore/detail/timeouts-and-intervals/...
2021-03-29 07:12:20

这是一个将所有 timerid 存储到数组中的实现,而不是只有计时器计数。它只显示活动计时器,而接受的答案只计算对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执行相同的操作,它们所做的但将来可能会发生变化。
不是我所知道的,我建议使用关键字“setInterval”和/或“setTimeout”进行全局搜索
2021-03-20 07:12:20
是否可以获取所有正在运行的名称SetIntervals例如,var timer = setInterval(function () { }我需要计时器而不是运行间隔的计数。
2021-04-05 07:12:20

看到 Paul 只涵盖了 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);
};

我们刚刚发布了一个包来解决这个确切的问题。

npm install time-events-manager

有了它,您可以通过timeoutCollection对象(以及通过对象的 javascript 间隔intervalCollection查看和管理它们

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

我认为 OP 和大多数人都在寻找一些东西,要么在浏览器的控制台中输入作为第一个 PoC 的内容,要么在稍后的扩展中输入。如何根据您提供的信息将其放入控制台?
2021-04-09 07:12:20