Как отследить все запущенные таймеры на странице? [дубликат]

155
24 марта 2019, 20:10

На данный вопрос уже ответили:

  • Бесконечный цикл с разными интервалами 2 ответа

Установил почтовый клиент rainlooop

js раз в определенное количество времени шлет запрос на php скрипт, который уже связывается c моим аккаунтом и получается список писем. Хочу изменить интервал проверки писем. если увидеть отправляемые запросы из консоли я могу то вот как увидеть какие таймеры стоят и в каких функциях, не понимаю

Answer 1

Как вариант переопределить стандартный setInterval в самом начале загрузки страницы и собрать все таймеры, соответствующие функции и интервалы в массив объектов. После полной загрузки страницы у вас будет массив объектов с полной информацией от таймерах. Затем у вас появится отличная возможность управлять таймерами так как вам необходимо "динамически"!

Пример реализации:

window.originalSetInterval = window.setInterval; 
let activeTimers = []; 
 
//Переопределение стандартного setInterval 
window.setInterval = function(callback, interval) { 
  const handler = window.originalSetInterval(callback, interval); 
  activeTimers.push({ 
    handler: handler, 
    callback: callback, 
    interval: interval 
  }); 
  return handler; 
}; 
 
window.getActiveTimers = () => { 
  return activeTimers.slice(); 
}; 
 
setInterval(() => { 
  console.log('#1') 
}, 5000); 
console.log(getActiveTimers()); 
setInterval(() => { 
  console.log('#2') 
}, 5000); 
console.log(getActiveTimers()); 
 
//Ждем полной загрузки всех ресурсов 
window.addEventListener('load', () => { 
  //Сбрасываем переоределение стандартного setInterval 
  window.setInterval = window.originalSetInterval; 
  console.log('Все ресурсы загружены!'); 
  //Удалить все таймеры (setInterval) по "ID" 
  activeTimers.map(elem => clearInterval(elem.handler)); 
  console.log('Все таймеры удалены!'); 
  //Но массив объектов у нас все еще есть 
  console.log(getActiveTimers()); 
 
  //Инициализируем таймеры снова но уже из массив объектов  
  activeTimers.map(elem => setInterval(elem.callback, elem.interval)); 
 
 
  //То есть вы можете управлять таймерами динамически 
  //Допустим я знаю что 2 таймер обновляется слишком быстро 5000мс 
  //А мне надо больше 10000мс (или меньше) 
  activeTimers.map(elem => { 
    if (elem.handler == 2) { 
      console.log('Второй таймер обновлен:'); 
      clearInterval(elem.handler); 
      elem.interval = 10000; 
      setInterval(elem.callback, elem.interval); 
    } 
  }); 
  console.log(getActiveTimers()); 
}, false);

Если есть вопросы могу дополнить ответ.

Answer 2

var oldSetInterval = window.setInterval; 
window.setInterval = function(){ 
  var f = arguments[0]; 
  arguments[0] = function() { 
    console.log("my interval wrapper:", f.toString(), JSON.stringify(arguments)); 
    f.apply(this, arguments); 
  }; 
  oldSetInterval.apply(this, arguments); 
}; 
 
setInterval(function(a, b){  
  console.log("real interval", a + b)  
}, 1000, 23, 100);

Отследить уже запущенные интервалы - нельзя. Но если вставить/выполнить этот код до всех других скриптов на странице, все интервалы будут вызываться через эту обертку. Думаю, это можно сделать через js расширение для браузера.

READ ALSO
Помогите переделать и дописать код в ооп стиль

Помогите переделать и дописать код в ооп стиль

Помогите правильно организовать программу, нужно написать todo консольную желательноУ нее должны быть поля

173
Button in canvas

Button in canvas

Доброго времени суток ребят!

153