Последовательность вывода в консоль с учётом приоритетов event loop

Вывод: 1, 6, 3, 5, 2, 4. catch и then уже завершённых Promise исполняются до таймеров, но Promise для 4 ещё ждёт разрешения своим таймером.

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

Что ответить на собеседовании

Вывод: 1, 6, 3, 5, 2, 4. catch и then уже завершённых Promise исполняются до таймеров, но Promise для 4 ещё ждёт разрешения своим таймером.

Подробный разбор

Ответ с пояснениями

Условие

Нужно установить, в каком порядке будут напечатаны значения в консоль. При этом учитываются приоритеты выполнения: сначала синхронный код, затем микрозадачи (microtasks) такие как .then и .catch, и в конце макрозадачи (macrotasks) типа setTimeout.

console.log(1);

setTimeout(() => console.log(2));

Promise.reject(3).catch(console.log);

new Promise(resolve => setTimeout(resolve)).then(() => console.log(4));

Promise.resolve(5).then(console.log);

console.log(6);

Ответ

Вывод: 1, 6, 3, 5, 2, 4. catch и then уже завершённых Promise исполняются до таймеров, но Promise для 4 ещё ждёт разрешения своим таймером.

Сначала выполняются синхронные console.log(1) и console.log(6). Далее микрозадачи выводят 3 и 5 в порядке регистрации.

Первый таймер печатает 2. Второй только вызывает resolve; уже после его завершения микрозадача then печатает 4. Фраза «Promise раньше таймеров» слишком груба: значение зависит от фактического момента завершения Promise и появления его реакций в очереди.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее