문제

저는 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 확장을 만들었습니다. 청소 된 것들이 회색으로 나뉩니다.

Timers Chrome Devtool extension

SetInterval-sniffer

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를 함수와 함께 기록하고 상태 (활성/비활성)를 추적합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top