Подтвердить что ты не робот

JavaScript. Можно ли просмотреть все запланированные таймауты?

Итак, мне было интересно, есть ли какой-либо возможный способ в JavaScript для просмотра информации о запланированных таймаутах и ​​интервалах, о которых вы явно не знаете (я знаю, что setTimeout и setInterval возвращает дескриптор, который можно использовать для ссылки к запланированному экземпляру, но скажите, что это недоступно по той или иной причине)? Например, есть ли способ использовать такой инструмент, как консоль Chrome JavaScript, чтобы определить, какие тайм-ауты в настоящее время активны на произвольной странице, когда они будут срабатывать, и какой код будет выполняться при их запуске? В частности, скажем, что страница только что выполнила следующий JavaScript:

setTimeout("alert('test');", 30000);

Есть ли какой-нибудь код, который я могу выполнить в этот момент, который скажет мне, что браузер выполнит alert('test'); через 30 секунд?

Кажется, что теоретически должен быть какой-то способ получить эту информацию, поскольку почти все, что в JavaScript открыто, является общедоступным, если вы знаете, где искать, но я не могу вспомнить экземпляр, когда-либо делающий это сам или видя, что это сделал кто-то еще.

4b9b3361

Ответ 1

как просто переписать функцию setTimeout для сортировки пользовательских функций ведения журнала?

как

var oldTimeout = setTimeout;
window.setTimeout = function(callback, timeout) {
  console.log("timeout started");
  return oldTimeout(function() {
    console.log('timeout finished');
    callback();
  }, timeout);
}

может работать?

Ответ 2

Нет, даже спецификация HTML5 (которая является рационализацией поведения HTML 4.01 в текущих браузерах с дополнительными функциями) не указывает способ перечислить доступные обратные вызовы.

Ответ 3

Мы только что опубликовали пакет, решая эту точную проблему.

npm install time-events-manager

При этом вы можете просматривать их через объекты timeoutCollection и intervalCollection.

Ответ 4

Вы также можете создать модуль диспетчера таймера, который будет отслеживать текущие таймеры и позволит вам получать, добавлять, останавливать и останавливать все таймеры.

var timers = (function() {
  //
  var timers = []

  //
  const getIndex = (array, attr, value) => {
      for (let i = 0; i < array.length; i += 1) {
          if (array[i][attr] === value) {
              return i
          }
      }
      return -1
  };

  // add
  const add = (callback, time) => {
    var id = setTimeout(() => {
      let index = getIndex(timers, 'id', id)
      timers.splice(index, 1)
      callback()
    }, time)
    timers.push({
      id: id,
      time: time,
      debug: callback.toString()
    })
  };

  // get all active timers
  const all = () => timers

  // stop timer by timer id
  const stop = (id) => {
    if (!isNaN(id)) {
      let index = getIndex(timers, 'id', id)
      if (index !== -1) {
        clearTimeout(timers[index].id)
        timers.splice(index, 1)
      }
    }
  };

  // stop all timers
  const stopAll = () => {
    for (let i = 0; i < timers.length; i++) {
      clearTimeout(timers[i].id)
    }
    timers = []
  };

  return {
    add: add,
    all: all,
    stop: stop,
    stopAll: stopAll,
  };
})();

//
timers.add(function() {
  console.log("timeout 1 fired");
}, 1000)

timers.add(function() {
  console.log("timeout 2 wont get fired");
}, 2000)

timers.add(function() {
  console.log("timeout 3 fired");
}, 3000)

timers.add(function() {
  console.log("timeout 4 fired, timers", timers.all());
}, 4000)

timers.add(function() {
  console.log("timeout 5 fired");
}, 5000)

console.log('All timers', timers.all())

console.log("kill timer 2")
timers.stop(2)