자바 스크립트에서 모든 시간 초과 / 간격을 보십니까?
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
것은 아니지만 최소한 런타임에 일어나는 일을 추적 할 수있는 방법을 제공합니다.
모든 간격을 표시하는 Chrome DevTools 확장 프로그램을 만들었습니다. 지워진 항목은 회색으로 표시됩니다.
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
동일한 작업을 수행하지만 나중에 변경 될 수 있습니다.
이 정확한 문제를 해결하는 패키지를 방금 게시 했습니다.
npm install time-events-manager
이를 통해 timeoutCollection
객체 (그리고 객체 를 통한 자바 스크립트의 간격)를 통해보고 관리 할 수 있습니다 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
) 를 추적 합니다.
참고 URL : https://stackoverflow.com/questions/858619/viewing-all-the-timeouts-intervals-in-javascript
'Program Tip' 카테고리의 다른 글
라이브 MongoDB 데이터를 검색하거나 쿼리하려면 어떻게해야합니까? (0) | 2020.10.12 |
---|---|
C에서 복잡한 프로젝트를 어떻게 구성해야합니까? (0) | 2020.10.12 |
파이썬에서 생성자를 복사 하시겠습니까? (0) | 2020.10.12 |
Python에서 open과 codecs.open의 차이점 (0) | 2020.10.12 |
클래스 확장 대 클래스 범주 (0) | 2020.10.12 |