ru.javascript.info icon indicating copy to clipboard operation
ru.javascript.info copied to clipboard

Неточность в главе Планирование: setTimeout и setInterval

Open TravellerOnline opened this issue 4 years ago • 0 comments

Глава Планирование: setTimeout и setInterval. https://learn.javascript.ru/settimeout-setinterval

из лекции: +++++++ Продемонстрируем в примере ниже, что это означает. Вызов setTimeout повторно вызывает себя через 0 мс. Каждый вызов запоминает реальное время от предыдущего вызова в массиве times. Какова реальная задержка? Посмотрим:

let start = Date.now();
let times = [];

setTimeout(function run() {
  times.push(Date.now() - start); // запоминаем задержку от предыдущего вызова (***)

  if (start + 100 < Date.now()) alert(times); // показываем задержку через 100 мс
  else setTimeout(run); // если нужно ещё запланировать
});

// пример вывода:
// 1,1,1,1,9,15,20,24,30,35,40,45,50,55,59,64,70,75,80,85,90,95,100

++++++++ по-моему в строке (***) мы запоминаем задержку не от предыдущего вызова, а от самого первого вызова, переменная start у нас со временем никак не изменяется, и с каждым рекурсивным вызовом setTimeOut мы считаем прошедшее время от первоначальной точки Если бы хотели показать задержку между каждым вызовом сеттаймаута, код был бы похож на этот:

let start = Date.now();
let times = [];
let last = Date.now();

setTimeout(function run() {
  times.push(Date.now() - last); // запоминаем задержку от предыдущего вызова

  if (start + 100 < Date.now()) alert(times); // показываем задержку через 100 мс
  else {
    last = Date.now();
    setTimeout(run); // если нужно ещё запланировать
  } 
});
// вывод : [1, 1, 2, 1, 5, 4, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 5, 5, 6, 5, 5]
// здесь видим задержки между каждым вызовом, первые четыре вызова действительно с задержками <4ms

Поправьте где неправ

TravellerOnline avatar Jan 17 '22 12:01 TravellerOnline