Вывод: 1, 6, 3, 5, 2, 4. catch и then уже завершённых Promise исполняются до таймеров, но Promise для 4 ещё ждёт разрешения своим таймером.
Последовательность вывода в консоль с учётом приоритетов event loop
Вывод: 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 и появления его реакций в очереди.