JavaScript. Можно ли просмотреть все запланированные таймауты?
Итак, мне было интересно, есть ли какой-либо возможный способ в JavaScript для просмотра информации о запланированных таймаутах и интервалах, о которых вы явно не знаете (я знаю, что setTimeout
и setInterval
возвращает дескриптор, который можно использовать для ссылки к запланированному экземпляру, но скажите, что это недоступно по той или иной причине)? Например, есть ли способ использовать такой инструмент, как консоль Chrome JavaScript, чтобы определить, какие тайм-ауты в настоящее время активны на произвольной странице, когда они будут срабатывать, и какой код будет выполняться при их запуске? В частности, скажем, что страница только что выполнила следующий JavaScript:
setTimeout("alert('test');", 30000);
Есть ли какой-нибудь код, который я могу выполнить в этот момент, который скажет мне, что браузер выполнит alert('test');
через 30 секунд?
Кажется, что теоретически должен быть какой-то способ получить эту информацию, поскольку почти все, что в JavaScript открыто, является общедоступным, если вы знаете, где искать, но я не могу вспомнить экземпляр, когда-либо делающий это сам или видя, что это сделал кто-то еще.
Ответы
Ответ 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)