شرح - sleep javascript




عرض جميع المهلات/الفواصل في javascript؟ (4)

أنا فقط بحاجة إلى شيء من هذا القبيل وهذا ما قمت بجمعه معًا:

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

يسجل هذا معرفات الفواصل الزمنية مع وظائفها ، كما يتتبع حالتها (نشط / غير نشط).

أنا أكتب تطبيقًا يستخدم فترات زمنية وفواصل جافا سكريبت لتحديث الصفحة. هل هناك طريقة لمعرفة عدد الفواصل الزمنية التي يتم إعدادها؟ أريد أن أتأكد من أنني لن أقوم بطريق الخطأ بقتل المتصفح من خلال إعداد مئات من الفواصل الزمنية.

هل هذه مشكلة؟


بدلا من مجرد وجود عدد من أجهزة ضبط الوقت ، وهنا هو تنفيذ الذي يخزن كل timerid في صفيف. يعرض فقط clearTimeout النشطة بينما تقوم الإجابة المقبولة فقط بحساب المكالمات إلى 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 تفعل الشيء نفسه ، وهو ما يفعلونه ولكن قد يتغير في المستقبل.

لا أعتقد أن هناك طريقة لتعداد المؤقتات النشطة ، ولكن يمكنك تجاوز 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 ، لكن هذا على الأقل سيعطيك طريقة لتتبع ما يحدث في وقت التشغيل.


لقد أجريت إضافة Chrome DevTools تعرض جميع الفواصل الزمنية. تم مسحها باللون الرمادي.

setInterval-sniffer





setinterval