Javascript'teki tüm zaman aşımlarını / aralıkları görüntülüyor musunuz?


89

Sayfayı güncellemek için JavaScript zaman aşımlarını ve aralıklarını kullanan bir uygulama yazıyorum. Kaç aralık ayarlandığını görmenin bir yolu var mı? Yüzlerce aralık kurulumuna sahip olarak tarayıcıyı yanlışlıkla öldürmeyeceğimden emin olmak istiyorum.

Bu bir sorun mu?

Yanıtlar:


79

Ben aktif zamanlayıcılar numaralandırmak için bir yol olduğunu sanmıyorum, ama geçersiz olabilir window.setTimeoutve window.clearTimeoutbazı izleme yapmak ve sonra orijinalleri çağrı Kendi uygulamaları ile değiştirin.

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

Tabii ki, her zaman aramayabilirsiniz clearTimeout, ancak bu en azından size çalışma zamanında neler olduğunu izlemeniz için bir yol sağlar.


3
Bugün biraz kodunda bu kullanılan, ancak gerekli activeTimersolduğunda azaltma clearTimeoutedildi değildir denir. Bu, ikinci satırı window.setTimeoutbununla değiştirerek kolayca başarılabilir : return window.originalSetTimeout(function() {func(); activeTimers--;},delay);
Rick Hitchcock

2
DOM ile ilgili JavaScript işlevleri 'değişmez' olacağından bu yanıt artık işe yaramayacak.
John Greene


11

Paul'un sadece setTimeout'u ele aldığını görünce, setInterval / clearInterval için bir sayaç paylaşacağımı düşündüm.

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

9

Sadece bir zamanlayıcı sayısına sahip olmak yerine, burada tüm timerid'leri bir dizide saklayan bir uygulama var. Yalnızca aktif zamanlayıcıları gösterirken, kabul edilen cevap yalnızca setTimeout& ile yapılan aramaları sayar 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));

Sayfadaki etkin zamanlayıcıların sayısını şu şekilde alabilirsiniz :

timers.length;

Tüm aktif zamanlayıcıları şu şekilde kaldırabilirsiniz :

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

Bilinen sınırlamalar:

  • setTimeoutBu maymun yamasıyla yalnızca bir işlevi (bir dizge değil) geçirebilirsiniz .
  • İşlev varsayar clearIntervalve clearTimeoutaynısını yapar, bunu yapar, ancak gelecekte değişebilir.

Tüm koşuların adını almak mümkün mü SetIntervals? Örneğin , çalışan aralıkların sayılması yerine zamanlayıcıyavar timer = setInterval(function () { } ihtiyacım var .
Yogesh Patel

Bildiğim kadarıyla değil, "setInterval" ve / veya "setTimeout" anahtar kelimesi ile genel bir arama öneririm
Carles Alcolea

4

Biz sadece ettik yayınlanan tam bu sorunu çözme bir paket.

npm install time-events-manager

Bununla, bunları timeoutCollectionnesne aracılığıyla (ve javascript aralıklarını intervalCollectionnesne aracılığıyla ) görüntüleyebilir ve yönetebilirsiniz .

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


2
Bence OP ve çoğu insan tarayıcının konsoluna ilk PoC olarak ve belki daha sonra bir uzantı olarak yazacak bir şeyler arıyorlardı. Verdiğiniz bilgilerden bunu konsola koymak nasıl olur?
Carles Alcolea

1

Sadece bunun gibi bir şeye ihtiyacım vardı ve bunu bir araya getirdim:

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

Bu, aralıkları idişlevleriyle birlikte kaydeder ve ayrıca durumlarının ( active/ inactive) kaydını tutar .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.