Как это работает?

let i = 0;

let start = Date.now();

function count() {

  // делаем часть тяжёлой работы (*)
  do {
    i++;
  } while (i % 1e6 != 0);

  if (i == 1e9) {
    alert("Done in " + (Date.now() - start) + 'ms');
  } else {
    setTimeout(count); // планируем новый вызов (**)
  }

}

count();


Правильно понимаю?

Вначале идет вызов функции, затем начинается выполняться этот код
do {
    i++;
  } while (i % 1e6 != 0);

и выполняется он до тех пор, пока истинно условие.
Как только условие ложно, то выполнение переходит на
if (i == 1e9) {
    alert("Done in " + (Date.now() - start) + 'ms');
  } else {
    setTimeout(count); // планируем новый вызов (**)
  }

А тут, если i = 1e9 происходит то, что внутри первых скобок, иначе вызов СетТаймаут.

Так? Не понимаю логику. На learn.js они не объясняют, как работают их программы.

Помогите понять, пожалуйста.
  • Вопрос задан
  • 130 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Это просто демонстрация того, как выполнять длинные циклические вычисления без подвешивания браузера.
Функция делает миллион проходов цикла, затем проверяет, достиг ли счётчик миллиарда. Если достиг, то выводит сообщение и завершается. Если нет, то функция ставит себя в очередь макрозадач вызовом setTimeout с нулевым временем. Перед повторным вызовом функции из очереди будут выполнены все накопившиеся за время работы цикла макро- и микрозадачи (события, промисы, другие сработавшие таймауты и интервалы).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы