जावास्क्रिप्ट में सभी टाइमआउट / अंतराल देखना?


88

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

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

जवाबों:


77

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


3
मैंने आज कुछ कोड में इसका उपयोग किया है, लेकिन activeTimersजब मुझे बुलाया नहींclearTimeout गया था, तो मुझे इसे कम करने की आवश्यकता थी । इस के साथ दूसरी पंक्ति के स्थान पर इसे आसानी से पूरा किया जाता है : window.setTimeoutreturn window.originalSetTimeout(function() {func(); activeTimers--;},delay);
रिक हिचकॉक

2
यह उत्तर कोई और काम नहीं कर पाएगा क्योंकि DOM से संबंधित जावास्क्रिप्ट फ़ंक्शन 'अपरिवर्तनीय' होंगे।
जॉन ग्रीन

29

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

टाइमर क्रोम Devtool एक्सटेंशन

setInterval-स्निफर


10
दुख की बात है कि यह क्रोम के साथ काम करना बंद कर देता है।
जोसेफ लेनॉक्स

@JosephLennox यह वैकल्पिक काम, अभी-अभी परीक्षण किया गया: chrome.google.com/webstore/detail/timeouts-and-intervals/…
ट्रेवर थॉम्पसन

@TreverThompson यह काम नहीं करता है।
SeyyedKhandon

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

9

इसके बजाय बस टाइमर की एक गिनती है, यहाँ एक कार्यान्वयन है जो सभी टाइमर की एक सरणी में संग्रहीत करता है। यह केवल सक्रिय टाइमर दिखाता है, जबकि स्वीकृत उत्तर केवल 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वही करता है, जो वे करते हैं लेकिन यह भविष्य में बदल सकता है।

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

ऐसा नहीं है कि मुझे पता है, मैं सुझाव दूंगा कि कीवर्ड "setInterval" और / या "setTimeout" के साथ एक वैश्विक खोज
Carles Alcolea

4

हमने इस सटीक मुद्दे को हल करते हुए एक पैकेज प्रकाशित किया है।

npm install time-events-manager

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

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


2
मुझे लगता है कि ओपी और अधिकांश लोग पहले PoC के रूप में ब्राउज़र के कंसोल में या तो टाइप करने के लिए कुछ ढूंढ रहे थे और शायद बाद में एक विस्तार में। आपके द्वारा दी गई जानकारी से कंसोल में डालने के बारे में कोई कैसे जाएगा?
Carles Alcolea

1

मुझे बस कुछ इस तरह की जरूरत थी और यही मैंने साथ रखा है:

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को उनके कार्यों के साथ रिकॉर्ड करता है, और उनकी स्थिति ( active/ inactive) का भी पता लगाता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.