我正在编写一个利用JavaScript超时和间隔来更新页面的应用程序。有没有办法查看设置了多少间隔?我想确保不会因设置数百个间隔而意外杀死浏览器。
这甚至是一个问题吗?
我正在编写一个利用JavaScript超时和间隔来更新页面的应用程序。有没有办法查看设置了多少间隔?我想确保不会因设置数百个间隔而意外杀死浏览器。
这甚至是一个问题吗?
Answers:
我认为没有办法枚举活动计时器,但是您可以覆盖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
,但这至少可以为您提供某种方式来跟踪运行时发生的情况。
我做了一个显示所有间隔的Chrome DevTools扩展程序。已清除的部分显示为灰色。
看到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);
};
这是一个将所有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
将此函数(而不是字符串)传递给此猴子补丁。clearInterval
并clearTimeout
执行相同的操作,但将来可能会发生变化。SetIntervals
?例如,var timer = setInterval(function () { }
我需要计时器而不是运行间隔计数。
我们刚刚发布了解决此确切问题的软件包。
npm install time-events-manager
这样,您可以通过timeoutCollection
对象查看和管理它们(并通过对象来查看javascript的间隔intervalCollection
)。
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);
这将记录间隔id
s及其功能,并跟踪其状态(active
/ inactive
)。
activeTimers
递减的时候clearTimeout
是不是叫。通过用以下代码替换第二行即可轻松实现window.setTimeout
:return window.originalSetTimeout(function() {func(); activeTimers--;},delay);