Задать вопрос

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

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 они не объясняют, как работают их программы.

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

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

Похожие вопросы