2009-05-13 17 views

cevap

53

Etkin zamanlayıcıları sıralamanın bir yolu olduğunu sanmıyorum, ancak window.setTimeout ve window.clearTimeout'u geçersiz kılabilir ve bunları bazı izleme yapan ve sonra da orijinalleri arayarak kendi uygulamalarınızla değiştirebilirsiniz. Tabii

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

, her zaman clearTimeout çağrı olmayabilir, ama bu en azından size zamanında neler olduğunu izlemek için bir yol verecekti.

+5

Satır 2'de yazım hatası olduğunu unutmayın. window.cleartTimeout window.clearTimeout olmalıdır. SO, en az 6 karakter değiştirmeden düzenlememe izin vermez. – checker

+7

iyi görüldü, kimse fark etmeden 3 yıl geçti! –

+3

Bunu bugün bazı kodlarda kullandım, ancak 'clearTimeout'un * çağrılmadığı zaman' activeTimers 'değerine ihtiyacım vardı. Window.setTimeout'un ikinci satırının bununla değiştirilmesiyle kolayca yapılabilir: 'return window.originalSetTimeout (function() {func(); activeTimers -;}, gecikme);' –

11

Paul sadece setTimeout'u kapsadığı için 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); 
}; 
24

Tüm aralıklarını gösteren bir Chrome DevTools uzantısı yaptım. Temizlenmiş olanlar grileşmiştir. sadece zamanlayıcı sayımını sahip Yerine setInterval-sniffer

+5

Ne yazık ki bu, Chrome ile çalışmayı durdurdu. –

6

Timers Chrome Devtool extension

, burada bir diziye bütün timerId 's saklayan bir uygulamasıdır. Sadece kabul edilen yanıtı setTimeout & 'a sayarken sadece etkin zamanlayıcıları gösterir.

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

:

timers.length; 

Bu tüm aktif zamanlayıcılar kaldırmak için aşağıdaki adımları:

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

Bu

sayfadaki aktif zamanlayıcılar ait sayısı elde edebilir nasıl Bilinen sınırlamalar:

  • Bu maymun yamasıyla yalnızca bir işlevi (bir dizgi değil) setTimeout'a geçirebilirsiniz.
  • İşlev, clearInterval ve clearTimeout öğelerinin aynı olduğunu varsayar, aynı şekilde yapar, ancak gelecekte değişebilir.
+0

Tüm çalışan 'SetIntervals' ismini almak mümkün mü? Örneğin, 'var timer = setInterval (işlev() {}' Çalışan aralıkların sayısı yerine * timer * 'a ihtiyacım var. –

2

Bu tam sorunu çözmek için yalnızca published bir paketimiz var. Bunun üzerine

npm install time-events-manager 

görüntüleyebilir ve timeoutCollection nesne (ve intervalCollection nesne aracılığıyla javascript en aralıklarla) üzerinden yönetebilirsiniz.

0

Sadece böyle bir şey gerekli ve bu şimdiye araya getirdik budur:

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, onların fonksiyonları ile birlikte aralık kimlikleri kaydeder ve aynı zamanda onların durumu izler (aktif/pasif).

İlgili konular