Melihat semua batas waktu / interval dalam javascript?

89

Saya sedang menulis aplikasi yang memanfaatkan waktu tunggu dan interval JavaScript untuk memperbarui halaman. Adakah cara untuk melihat berapa banyak interval yang diatur? Saya ingin memastikan bahwa saya tidak akan mematikan browser secara tidak sengaja dengan melakukan ratusan pengaturan interval.

Apakah ini bahkan menjadi masalah?

Omar Kooheji
sumber

Jawaban:

79

Saya tidak berpikir ada cara untuk menghitung aktif timer, tapi Anda bisa menimpa window.setTimeoutdan window.clearTimeoutdan menggantinya dengan implementasi Anda sendiri yang melakukan pelacakan dan kemudian memanggil aslinya.

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

Tentu saja, Anda mungkin tidak selalu menelepon clearTimeout, tetapi ini setidaknya akan memberi Anda cara untuk melacak apa yang terjadi saat runtime.

Paul Dixon
sumber
3
Saya menggunakan ini di beberapa kode hari ini, tapi aku butuh activeTimersuntuk pengurangan ketika clearTimeoutitu tidak disebut. Itu mudah dicapai dengan mengganti baris kedua window.setTimeoutdengan ini: return window.originalSetTimeout(function() {func(); activeTimers--;},delay);
Rick Hitchcock
2
Jawaban ini tidak akan dapat berfungsi lagi karena fungsi JavaScript terkait DOM akan 'tidak berubah'.
John Greene
11

Mengingat Paul hanya membahas setTimeout, saya pikir saya akan membagikan penghitung untuk 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);
};
crv
sumber
9

Alih-alih hanya menghitung timer, berikut adalah implementasi yang menyimpan semua timerid ke dalam array. Ini hanya menunjukkan timer aktif sedangkan jawaban yang diterima hanya menghitung panggilan ke 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));

Ini adalah bagaimana Anda bisa mendapatkan jumlah timer aktif di halaman:

timers.length;

Inilah cara Anda dapat menghapus semua timer aktif :

for(var i = timers.length; i--;)
    clearInterval(timers[i]);

Batasan yang diketahui:

  • Anda hanya bisa meneruskan fungsi (bukan string) ke setTimeoutdengan patch monyet ini.
  • Fungsi mengasumsikan clearInterval dan clearTimeoutmelakukan hal yang sama, yang mereka lakukan tetapi dapat berubah di masa mendatang.
A1rPun
sumber
Apakah mungkin untuk mendapatkan nama semua yang berjalan SetIntervals? Misalnya var timer = setInterval(function () { }saya membutuhkan timer alih-alih menghitung interval lari.
Yogesh Patel
Setahu saya tidak, saya sarankan melalui pencarian global dengan kata kunci "setInterval" dan / atau "setTimeout"
Carles Alcolea
4

Kami baru saja menerbitkan paket yang memecahkan masalah ini.

npm install time-events-manager

Dengan itu, Anda dapat melihat dan mengelolanya melalui timeoutCollectionobjek (dan interval javascript melalui intervalCollectionobjek).

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

Ziv polack
sumber
2
Saya pikir OP dan kebanyakan orang mencari sesuatu untuk diketik di konsol browser sebagai PoC pertama dan mungkin nanti dalam ekstensi. Bagaimana cara meletakkan itu di konsol dari informasi yang Anda berikan?
Carles Alcolea
1

Saya hanya membutuhkan sesuatu seperti ini dan inilah yang telah saya kumpulkan:

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

Ini merekam interval idbersama dengan fungsinya, dan juga melacak statusnya ( active/ inactive).

akinuri
sumber