Как работает этот рекурсивный вызов в функции SetInterval? - PullRequest
0 голосов
/ 17 октября 2018

Следующий код является решением проблемы, отправленной автором онлайн-курса, который я прохожу.Цель состоит в том, чтобы постоянно печатать сообщение «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);

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

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

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

1 Ответ

0 голосов
/ 18 октября 2018

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

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

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

...