Xem tất cả thời gian chờ / khoảng thời gian trong javascript?


88

Tôi đang viết một ứng dụng sử dụng thời gian chờ và khoảng thời gian JavaScript để 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 đảm bảo rằng tôi sẽ 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.

Đây có phải là một vấn đề?

Câu trả lời:


77

Tôi không nghĩ rằng có một cách để liệt kê giờ hoạt động, nhưng bạn có thể ghi đè lên window.setTimeoutwindow.clearTimeoutvà thay thế chúng với hiện thực của riêng bạn mà làm một số việc 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 xảy ra trong thời gian chạy.


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

2
Câu trả lời này sẽ không thể hoạt động nữa vì các hàm JavaScript liên quan đến DOM sẽ là 'bất biến'.
John Greene

29

Tôi đã tạo 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.

Tiện ích mở rộng hẹn giờ cho Chrome Devtool

setInterval-sniper


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

@JosephLennox Giải pháp thay thế này hoạt động, vừa được thử nghiệm: chrome.google.com/webstore/detail/timeouts-and-intervals/…
Trever Thompson

@TreverThompson điều này cũng không hoạt động.
SeyyedKhandon

11

Thấy Paul chỉ đề cập đến setTimeout, tôi nghĩ tôi sẽ chia sẻ một bộ đếm 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);
};

9

Thay vì chỉ có một bộ đếm thời gian, đây là một triển khai lưu trữ tất cả các dòng thời gian vào một mảng. Nó 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 các 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ể nhận được số lượng bộ hẹn giờ hoạt động trên trang:

timers.length;

Đây là cách bạn có thể xóa tất cả các bộ hẹn giờ đang hoạt động :

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

Các hạn chế đã biết:

  • Bạn chỉ có thể chuyển một hàm (không phải một chuỗi) đến setTimeoutvới bản vá khỉ này.
  • Hàm giả định clearIntervalclearTimeoutthực hiện tương tự, điều này họ làm nhưng nó có thể thay đổi trong tương lai.

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

Không phải là tôi biết, tôi muốn đề nghị mặc dù một tìm kiếm toàn cầu với từ khóa "setInterval" và / hoặc "setTimeout"
Carles Alcolea

4

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

npm install time-events-manager

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

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


2
Tôi nghĩ OP và hầu hết mọi người đang tìm kiếm thứ gì đó để gõ vào bảng điều khiển của trình duyệt dưới dạng PoC đầu tiên và có thể sau đó là một tiện ích mở rộng. Làm thế nào để đưa nó vào bảng điều khiển từ thông tin bạn đã cung cấp?
Carles Alcolea

1

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

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

Điều này ghi lại khoảng thời gian idcùng với các chức năng của chúng và cũng theo dõi trạng thái của chúng ( active/ inactive).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.