Skip to content

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

@TravellerOnline

Description

@TravellerOnline

Глава Планирование: 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

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions