Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: JavaScript, Event Loop, Promise, microtask, asynchronous

3333

Вопрос проверяет понимание принципов работы с асинхронным кодом в JavaScript, в частности, как обрабатываются промисы и микрозадачи в Event Loop.

Короткий ответ

Код выведет '1', '3', '2'. Сначала выполнится синхронный console.log('1'). Затем промис создаёт микрозадачу (microtask) для своего обработчика .then, но она выполнится только после завершения текущего макрозадания (macrotask). Следующий синхронный console.log('3') выполняется сразу. После этого Event Loop обрабатывает очередь микрозадач и выполняет console.log('2') из промиса.

Длинный ответ

Этот вопрос демонстрирует ключевой механизм работы асинхронного JavaScript — Event Loop и приоритетность выполнения задач. Понимание этого необходимо для предсказания порядка выполнения кода, особенно при работе с промисами, async/await и другими асинхронными операциями.

Как работает Event Loop

JavaScript имеет однопоточную модель выполнения, но использует Event Loop для обработки асинхронных операций без блокировки основного потока. Event Loop управляет двумя основными очередями: очередью задач (macrotask queue) и очередью микрозадач (microtask queue). К макрозадачам относятся, например, setTimeout, setInterval, I/O-операции. К микрозадачам — обработчики промисов (.then, .catch, .finally) и queueMicrotask.

Порядок выполнения

Основное правило: после выполнения каждой макрозадачи Event Loop сначала полностью очищает всю очередь микрозадач, прежде чем взять следующую макрозадачу. Это обеспечивает высокий приоритет для промисов.

Разбор примера кода

Рассмотрим исходный код:

console.log('1');

Promise.resolve()
  .then(() => console.log('2'));

console.log('3');
  1. Выполняется синхронный код: console.log('1') выводит '1'.
  2. Создаётся промис с помощью Promise.resolve(). Метод .then(() => console.log('2')) регистрирует колбэк в очереди микрозадач, но не выполняет его сразу.
  3. Выполняется следующий синхронный код: console.log('3') выводит '3'. На этом текущее макрозадание (изначальный скрипт) завершается.
  4. Event Loop переходит к фазе обработки микрозадач. Очередь микрозадач содержит колбэк из промиса. Он выполняется, и console.log('2') выводит '2'.

Таким образом, порядок вывода: '1', '3', '2'.

Практическое применение

Понимание этого порядка критично для:

  • Отладки сложных асинхронных цепочек.
  • Написания корректных тестов, которые зависят от порядка выполнения.
  • Оптимизации производительности, чтобы не блокировать Event Loop длительными синхронными операциями между микрозадачами.
  • Реализации паттернов, где нужно гарантировать выполнение кода после всех текущих промисов (например, с помощью queueMicrotask).

Вывод: Этот пример наглядно показывает приоритет микрозадач (обработчиков промисов) над макрозадачами. Знание этого механизма помогает писать предсказуемый асинхронный код и является фундаментальным для любого JavaScript-разработчика.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#JavaScript

#Event Loop

#Promise

#microtask

#asynchronous

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию