2009-05-13 14 views
52

मैं एक ऐसा एप्लिकेशन लिख रहा हूं जो पृष्ठ को अपडेट करने के लिए जावास्क्रिप्ट टाइमआउट और अंतराल का उपयोग करता है। क्या यह देखने का कोई तरीका है कि कितने अंतराल सेट किए गए हैं? मैं यह सुनिश्चित करना चाहता हूं कि मैं सैकड़ों अंतराल सेटअप करके ब्राउज़र को मारने के लिए गलती से नहीं जा रहा हूं।जावास्क्रिप्ट में सभी टाइमआउट/अंतराल देखना?

क्या यह भी एक मुद्दा है?

उत्तर

53

मुझे नहीं लगता कि सक्रिय टाइमर की गणना करने का कोई तरीका है, लेकिन आप 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 फोन नहीं सकता है, लेकिन यह कम से कम आप किसी तरह क्या रनटाइम पर हो रहा है ट्रैक करने के लिए देना होगा।

+5

ध्यान दें कि लाइन 2 में एक टाइपो है। window.cleartTimeout window.clearTimeout होना चाहिए। तो मुझे कम से कम 6 वर्णों को बदलने के बिना इसे संपादित करने नहीं देगा। – checker

+7

अच्छी तरह से देखा गया, किसी ने देखा कि यह 3 साल पहले चला गया! –

+3

मैंने आज कुछ कोड में इसका इस्तेमाल किया, लेकिन जब मुझे 'clearTimeout' * नहीं कहा गया था तो मुझे' सक्रिय टाइमर 'की आवश्यकता थी। यह 'window.setTimeout' की दूसरी पंक्ति को आसानी से पूरा करके आसानी से पूरा किया जाता है:' वापसी विंडो। ऑरिगिनलसेट टाइमआउट (फ़ंक्शन() {func(); सक्रिय टाइमर -;}, देरी); ' –

11

पौलुस ने केवल सेट को कवर किया है, मैंने सोचा था कि मैं सेट इंटरवल/स्पष्ट अंतराल के लिए काउंटर साझा करूंगा।

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

मैंने क्रोम देवटूल एक्सटेंशन बनाया जो सभी अंतराल दिखाता है। साफ़ किए गए लोग बाहर हैं।

Timers Chrome Devtool extension

setInterval-sniffer

+5

अफसोस की बात यह है कि क्रोम के साथ काम करना बंद कर दिया गया है। –

6

के बजाय सिर्फ टाइमर की गिनती है, यहाँ एक कार्यान्वयन जो एक सरणी में सभी timerid के संग्रहीत करता है। यह केवल सक्रिय टाइमर दिखाता है जबकि स्वीकृत उत्तर केवल setTimeout & clearTimeout पर कॉल की गणना करता है।

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

:

timers.length; 

यह आप कैसे सभी सक्रिय टाइमर को दूर कर सकते हैं:

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

इस तरह आप पृष्ठ पर सक्रिय टाइमर की गिनती प्राप्त कर सकते है ज्ञात सीमाएं:

  • आप इस बंदर पैच के साथ केवल setTimeout पर एक फ़ंक्शन (स्ट्रिंग नहीं) पास कर सकते हैं।
  • फ़ंक्शन clearInterval और clearTimeout मानता है, वही करता है, लेकिन वे भविष्य में बदल सकते हैं।
+0

क्या सभी चल रहे 'SetIntervals' का नाम प्राप्त करना संभव है? उदाहरण के लिए 'var timer = setInterval (function() {}' मुझे चलने वाले अंतराल की गिनती के बजाय * टाइमर * की आवश्यकता है। –

2

हमारे पास इस सटीक समस्या को हल करने वाला एक पैकेज है published

npm install time-events-manager 
इसी के साथ

, आप देख सकते हैं और timeoutCollection वस्तु (और intervalCollection वस्तु के माध्यम से जावास्क्रिप्ट के अंतराल) के माध्यम से उन्हें प्रबंधन कर सकते हैं।

0

मैं बस कुछ इस तरह की जरूरत है और यह है कि क्या मैं एक साथ रख दिया है:

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

यह उनके कार्यों के साथ-साथ अंतराल आईडी रिकॉर्ड करता है, और यह भी उनकी स्थिति का ट्रैक रखता है (सक्रिय/निष्क्रिय)।

संबंधित मुद्दे