Как работает этот рекурсивный вызов в функции SetInterval?

1

Следующий код - это решение проблемы, заданной автором онлайн-курса, который я принимаю. Цель состоит в том, чтобы непрерывно печатать сообщение "Hello World" (вместе с временем задержки) в группах по 5 сообщений, в которых задержка увеличивается на 100 мс для каждой группы. Он опубликовал объяснение для этого решения (см. Раздел "Таймеры" №4) в статье "Средняя", но он больше напоминает подход, чем объяснение.

Я успешно использовал рекурсию в других упражнениях и программах, но, возможно, потому, что я никогда не использовал их в контексте метода setInterval, я просто не понимаю, как он работает в этой ситуации.

(Поскольку это повторяется бесконечно, я не размещаю это как исполняемый фрагмент.)

let lastIntervalId, counter = 5;

const greeting = delay => {
  if (counter === 5) {
    clearInterval(lastIntervalId);
    lastIntervalId = setInterval(() => {
      console.log('Hello World. ' + delay);
      greeting(delay + 100);
    }, delay);
    counter = 0;
  }

  counter += 1;
};

greeting(100);

Я прочитал его всю статью в Среднем виде, а также перечитал несколько статей о рекурсии, но я не могу найти ничего, что действительно применимо к этому использованию рекурсии в течение таймера JavaScript.

Мне кажется, что если сообщение журнала повторяется в группах по 5, то рекурсивный вызов greeting(delay + 100) также будет называться 5 раз и что для каждого из этих периодов будут сделаны еще 5 рекурсивных вызовов и так что экспоненциально.

Если бы кто-то мог объяснить мне шаг за шагом, как этот процесс действительно разыгрывается, я бы очень признателен.

Теги:
recursion
setinterval

1 ответ

3
Лучший ответ

Вы не получаете взрывающийся экспоненциальный рост, потому что один setInterval никогда не создается без остановки старого. setInterval() всегда предшествует clearInterval(lastIntervalId).

Даже если функция setInterval вызывает greeting каждый раз, когда она срабатывает, большинство вызовов пропускают if и just increment counter и консольный журнал. Именно это создает поведение групп из пяти человек.

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

  • 0
    Ваше объяснение полезно, но я до сих пор не понимаю, как greeting(200) не вызывается 5 раз, и как каждый из этих вызовов не вызывает greeting(300) 5 раз, поэтому стек заканчивается 5 приветствиями, затем 5 + 25, затем 5 + 25 + 125 и т. д.
  • 1
    Эй, @PaulBrady, рекурсивная функция делает вид, будто выкручиваешь свое мнение. greeting(200) вызывается пять раз, но 4 из пяти пропускают блок if поскольку счетчик не равен пяти - они просто увеличивают счетчик и возвращаются без каких-либо дальнейших рекурсивных вызовов.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню