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?
javascript
timeout
setinterval
Omar Kooheji
sumber
sumber
activeTimers
untuk pengurangan ketikaclearTimeout
itu tidak disebut. Itu mudah dicapai dengan mengganti baris keduawindow.setTimeout
dengan ini:return window.originalSetTimeout(function() {func(); activeTimers--;},delay);
Saya membuat ekstensi Chrome DevTools yang menampilkan semua interval. Yang dihapus berwarna abu-abu.
setInterval-sniffer
sumber
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); };
sumber
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:
Inilah cara Anda dapat menghapus semua timer aktif :
for(var i = timers.length; i--;) clearInterval(timers[i]);
Batasan yang diketahui:
setTimeout
dengan patch monyet ini.clearInterval
danclearTimeout
melakukan hal yang sama, yang mereka lakukan tetapi dapat berubah di masa mendatang.sumber
SetIntervals
? Misalnyavar timer = setInterval(function () { }
saya membutuhkan timer alih-alih menghitung interval lari.Kami baru saja menerbitkan paket yang memecahkan masalah ini.
Dengan itu, Anda dapat melihat dan mengelolanya melalui
timeoutCollection
objek (dan interval javascript melaluiintervalCollection
objek).timeoutCollection.getScheduled(); timeoutCollection.getCompleted(); timeoutCollection.getAll();
sumber
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
id
bersama dengan fungsinya, dan juga melacak statusnya (active
/inactive
).sumber