Вопрос проверяет понимание event loop и различия между синхронным кодом и микрозадачами.
then и finally выполняются после синхронного кода, потому что они ставятся в очередь микрозадач. JavaScript сначала выполняет весь синхронный код в текущем стеке вызовов. Только после этого event loop начинает обрабатывать микрозадачи. Поэтому обработчики промисов всегда выполняются “чуть позже”.
Чтобы понять это поведение, нужно разобрать модель выполнения JavaScript.
Определение: Event loop — механизм, который управляет выполнением синхронного кода, микрозадач и макрозадач.
JavaScript следует строгому порядку:
Выполняется весь синхронный код (call stack).
Затем выполняются все микрозадачи.
Потом берётся следующая макрозадача.
Promise.then
Promise.catch
Promise.finally
Все они добавляются в очередь microtask queue.
console.log('start');
Promise.resolve().then(() => {
console.log('then');
});
console.log('end');
Порядок вывода:
start
end
then
объясняет “неожиданный” порядок console.log
помогает отлаживать асинхронный код
критично для React, где много промисов и эффектов
Ожидание, что then выполнится “сразу после resolve” внутри того же синхронного блока.
Вывод: then и finally выполняются после синхронного кода, потому что они обрабатываются как микрозадачи и запускаются event loop только после очистки текущего стека вызовов.