자바스크립트에서 모든 시간 초과/간격을 보고 계시나요?
-
21-08-2019 - |
문제
저는 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);
};
타이머 카운트가있는 대신 모든 타이머를 배열에 저장하는 구현이 있습니다. 그것은 단지 보여줍니다 활성 타이머 허용 된 대답은 전화 만 계산합니다 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를 함수와 함께 기록하고 상태 (활성/비활성)를 추적합니다.