سؤال

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

هذا مشكلة ؟

هل كانت مفيدة؟

المحلول

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

Timers Chrome Devtool extension

setInterval-الشم

وكما نرى بول وقد غطت فقط setTimeout اعتقدت انني سوف تتقاسم عداد setInterval / clearInterval.

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

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

لقد فقط نشرت حزمة حل هذه المسألة بالضبط.

npm install time-events-manager

مع ذلك، يمكنك عرض وإدارتها عبر الكائن timeoutCollection (وجوه فترات جافا سكريبت لviaintervalCollection).

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

وأنا فقط بحاجة لشيء من هذا القبيل، وهذا هو ما كنت قد وضعت معا:

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top