javascriptですべてのタイムアウト/間隔を表示していますか?


89

JavaScriptのタイムアウトと間隔を利用してページを更新するアプリケーションを作成しています。設定されている間隔の数を確認する方法はありますか?何百もの間隔を設定して、誤ってブラウザを強制終了しないようにしたいと思います。

これも問題ですか?

回答:


79

私は、アクティブなタイマーを列挙する方法があるとは思わないが、あなたはオーバーライドすることができますwindow.setTimeoutwindow.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が、これにより、少なくとも実行時に何が起こっているかを追跡する方法が得られます。


3
今日、いくつかのコードでこれを使用しましactiveTimersclearTimeout呼び出されなかったときにデクリメントする必要がありました。簡単の2行目に置き換えることにより実現だとwindow.setTimeout:これで return window.originalSetTimeout(function() {func(); activeTimers--;},delay);
リック・ヒッチコック

2
DOM関連のJavaScript関数は「不変」になるため、この回答は機能しなくなります。
ジョングリーン


11

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);
};

9

タイマーの数だけではなく、すべてのtimeridを配列に格納する実装があります。受け入れられた回答は&への呼び出しのみをカウントするのに対し、アクティブなタイマーのみが表示されますsetTimeoutclearTimeout

(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 () { }が必要です。
Yogesh Patel 2017

私が知っていることではありませんが、キーワード「setInterval」および/または「setTimeout」を使用したグローバル検索をお勧めします
Carles Alcolea 2018年

4

私達はちょうどまし公開し、この正確な問題を解決するパッケージを。

npm install time-events-manager

これにより、timeoutCollectionオブジェクトを介してそれらを表示および管理できます(およびオブジェクトを介してjavascriptの間隔intervalCollection)。

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


2
OPとほとんどの人は、最初のPoCとして、そしておそらく後で拡張機能として、ブラウザーのコンソールに入力するものを探していたと思います。あなたが提供した情報から、それをコンソールに入れるにはどうすればよいでしょうか?
Carles Alcolea 2018年

1

私はちょうどこのようなものが必要でした、そしてこれは私がまとめたものです:

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をそれらの関数とともに記録し、それらのステータス(active/ inactive)も追跡します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.