জাভাস্ক্রিপ্টে সমস্ত সময়সীমা / অন্তর দেখছেন?


89

আমি একটি অ্যাপ্লিকেশন লিখছি যা পৃষ্ঠা আপডেট করার জন্য জাভাস্ক্রিপ্ট টাইমআউট এবং অন্তরগুলি ব্যবহার করে। কতগুলি অন্তর সেটআপ আছে তা দেখার কোনও উপায় আছে? আমি নিশ্চিত করতে চাই যে আমি কয়েকশ বিরতি সেটআপ করে ভুলক্রমে ব্রাউজারটিকে হত্যা করতে যাচ্ছি না।

এটি কি একটি সমস্যা?

উত্তর:


79

আমি মনে করি না সেখানে সক্রিয় টাইমার গনা একটি উপায়, কিন্তু আপনি ওভাররাইড করতে পারে 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, তবে এটি কমপক্ষে আপনাকে রানটাইমের সময় কী ঘটছে তা ট্র্যাক করার কোনও উপায় দেয়।


4
আমি আজ এটি কোনও কোডে ব্যবহার করেছি, তবে activeTimersযখন ডাকা হয়নি তখন clearTimeoutআমার হ্রাস হওয়া দরকার । এটির দ্বিতীয় লাইনের পরিবর্তে এটি সহজেই সম্পন্ন হয়েছে : window.setTimeoutreturn window.originalSetTimeout(function() {func(); activeTimers--;},delay);
রিক হিচকক

4
এই উত্তর আর কোনও কাজ করতে পারবে না যেহেতু ডোম-সম্পর্কিত জাভাস্ক্রিপ্ট ফাংশনগুলি 'পরিবর্তনযোগ্য' হবে।
জন গ্রিন

29

আমি একটি ক্রোম ডেভটুলস এক্সটেনশন তৈরি করেছি যা সমস্ত বিরতি দেখায়। ক্লিয়ার করাগুলি গ্রে আউট করা হয়।

টাইমারগুলি ক্রোম ডিভটোল এক্সটেনশান

setInterval-sniffer


10
দুঃখের বিষয় এটি ক্রোমের সাথে কাজ করা বন্ধ করে দিয়েছে।
জোসেফ লেনাক্স

@ জোসেফএলএননক্স এই বিকল্পটি এখনই পরীক্ষিত হয়েছে: chrome.google.com/webstore/detail/timeouts-and-intervals/…
থম্পসন

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 () { }আমার চলমান অন্তরগুলি গণনার পরিবর্তে টাইমার প্রয়োজন ।
যোগেশ প্যাটেল

আমি জানি না, আমি "সেটইন্টারভাল" এবং / অথবা "সেটটাইমআউট" কীওয়ার্ড দিয়ে বিশ্বব্যাপী অনুসন্ধান করার পরামর্শ দিয়েছিলাম
কার্লস

4

আমরা ঠিক এই সমস্যাটি সমাধান করার জন্য একটি প্যাকেজ প্রকাশ করেছি ।

npm install time-events-manager

এটির সাহায্যে আপনি এগুলি timeoutCollectionঅবজেক্টের মাধ্যমে (এবং জাভাস্ক্রিপ্টের অন্তরগুলি intervalCollectionবস্তুর মাধ্যমে ) দেখতে এবং পরিচালনা করতে পারেন ।

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


4
আমি মনে করি ওপি এবং বেশিরভাগ লোকেরা ব্রাউজারের কনসোলটি প্রথম পিওসি হিসাবে এবং সম্ভবত পরে কোনও এক্সটেনশনে টাইপ করার জন্য কিছু খুঁজছিল। আপনার দেওয়া তথ্য থেকে কেউ কনসোলে কীভাবে তা রাখবেন?
কার্লস অ্যালকোলেয়া

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) টিও রাখে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.