JavaScriptのタイムアウトと間隔を使用してページを更新するアプリケーションを作成しています。設定されている間隔の数を確認する方法はありますか?私は、間違って何百ものインターバルを設定してブラウザを殺すつもりはないことを確認したい。すべてのタイムアウト/インターバルをjavascriptで表示しますか?
これは問題でもありますか?
JavaScriptのタイムアウトと間隔を使用してページを更新するアプリケーションを作成しています。設定されている間隔の数を確認する方法はありますか?私は、間違って何百ものインターバルを設定してブラウザを殺すつもりはないことを確認したい。すべてのタイムアウト/インターバルを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を呼び出さないかもしれないが、これは、少なくともあなたの実行時に何が起こっているかを追跡するためのいくつかの方法を与えるだろう。
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);
};
すべての間隔を示すChrome DevTools拡張機能を作成しました。クリアされたものはグレー表示されます。
悲しいことに、これはChromeでの使用が停止したように見えます。 –
だけではなくタイマーのカウントを持って、ここでは配列にすべて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(){}'実行間隔のカウントの代わりに* timer *が必要です。 –
この正確な問題を解決するパッケージはpublishedです。それと
npm install time-events-manager
、あなたは(intervalCollection
オブジェクトを介してとJavaScriptの間隔)timeoutCollection
オブジェクトを介してそれらを表示および管理することができます。
私はちょうどこのような何かを必要とし、これは私がまとめたものである:
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を記録し、またその状態(アクティブ/非アクティブ)を追跡します。
2行目にタイプミスがあることに注意してください。 window.cleartTimeoutはwindow.clearTimeoutでなければなりません。少なくとも6文字は変更せずに編集することはできません。 – checker
はよく目撃され、3年前に誰かが気付いた! –
今日はこれをいくつかのコードで使っていましたが、 'clearTimeout'が呼び出されなかったときに' activeTimers'を減らす必要がありました。 'window.originalSetTimeout(function(){func(); activeTimers - ;}、delay);' –