2009-05-13 56 views
52

Tôi đang viết một ứng dụng sử dụng hết thời gian chờ JavaScript và khoảng thời gian để cập nhật trang. Có cách nào để xem có bao nhiêu khoảng thời gian được thiết lập? Tôi muốn chắc chắn rằng tôi không vô tình giết chết trình duyệt bằng cách thiết lập hàng trăm khoảng thời gian.Xem tất cả thời gian chờ/khoảng thời gian trong javascript?

Đây có phải là vấn đề không?

Trả lời

53

Tôi không nghĩ rằng có một cách để đếm thời gian hoạt động, nhưng bạn có thể ghi đè window.setTimeout và window.clearTimeout và thay thế chúng bằng cách triển khai của riêng bạn thực hiện theo dõi và sau đó gọi bản gốc.

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

Tất nhiên, bạn có thể không phải lúc nào cũng gọi clearTimeout, nhưng điều này ít nhất sẽ cung cấp cho bạn một số cách để theo dõi những gì đang diễn ra trong thời gian chạy.

+5

Lưu ý rằng Dòng 2 có lỗi đánh máy. window.cleartTimeout phải là window.clearTimeout. SO sẽ không cho phép tôi chỉnh sửa nó mà không thay đổi ít nhất 6 ký tự. – checker

+7

cũng phát hiện, nó đã đi 3 năm trước khi bất cứ ai nhận thấy! –

+3

Tôi đã sử dụng mã này trong một số mã ngày hôm nay, nhưng tôi cần 'activeTimers' để giảm khi' clearTimeout' được * không * gọi. Điều đó dễ dàng thực hiện bằng cách thay thế dòng thứ hai của 'window.setTimeout' bằng cách này:' return window.originalSetTimeout (function() {func(); activeTimers -;}, delay); ' –

11

Xem như Paul chỉ bao phủ setTimeout Tôi nghĩ rằng tôi sẽ chia sẻ một truy cập cho 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); 
}; 
24

Tôi đã thực hiện tiện ích mở rộng Chrome DevTools hiển thị tất cả các khoảng thời gian. Những cái đã xóa có màu xám.

Timers Chrome Devtool extension

setInterval-sniffer

+5

Đáng buồn thay, điều này dường như đã ngừng hoạt động với Chrome. –

6

Thay vì chỉ có một đếm giờ, đây là một thực hiện mà các cửa hàng tất cả của timerid vào một mảng. Chỉ hiển thị bộ hẹn giờ hoạt động trong khi câu trả lời được chấp nhận chỉ tính số cuộc gọi đến 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)); 

Đây là cách bạn có thể lấy số của giờ hoạt động trên trang:

timers.length; 

Đây là cách bạn có thể loại bỏ tất cả các giờ hoạt động:

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

Các giới hạn đã biết:

  • Bạn chỉ có thể chuyển một hàm (không phải là chuỗi) đến setTimeout với bản vá khỉ này.
  • Hàm này giả định clearIntervalclearTimeout cũng làm như vậy, nhưng chúng có thể thay đổi trong tương lai.
+0

Có thể lấy tên của tất cả các 'SetIntervals' đang chạy? Ví dụ 'var timer = setInterval (function() {}' Tôi cần * timer * thay vì đếm các khoảng thời gian chạy. –

2

Chúng tôi vừa mới published gói giải quyết vấn đề chính xác này.

npm install time-events-manager 

Với điều đó, bạn có thể xem và quản lý chúng thông qua timeoutCollection đối tượng (và khoảng javascript của qua intervalCollection đối tượng).

0

Tôi chỉ cần một cái gì đó như thế này và đây là những gì tôi đã đặt lại với nhau:

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

này ghi lại id khoảng cùng với chức năng của mình, và cũng có thể theo dõi tình trạng của họ (active/inactive).

Các vấn đề liên quan