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
が、これにより、少なくとも実行時に何が起こっているかを追跡する方法が得られます。
すべての間隔を表示するChromeDevTools拡張機能を作成しました。クリアされたものは灰色で表示されます。
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
が、呼び出されなかったときにデクリメントする必要がありました。簡単の2行目に置き換えることにより実現だとwindow.setTimeout
:これでreturn window.originalSetTimeout(function() {func(); activeTimers--;},delay);