Вопрос проверяет понимание жизненного цикла Promise и порядка выполнения кода в JavaScript.
Конструктор Promise выполняется синхронно сразу при создании. Вызовы then, catch и finally регистрируют колбэки синхронно. Но сами колбэки выполняются асинхронно. Они попадают в очередь microtasks. Это гарантирует предсказуемый порядок выполнения.
Promise сочетает в себе синхронное и асинхронное поведение, что часто вызывает путаницу.
Вызов конструктора Promise
Функция-исполнитель (executor) запускается сразу.
new Promise((resolve) => {
console.log('sync')
resolve(1)
})
Регистрация обработчиков
Вызовы then, catch, finally выполняются сразу и просто добавляют колбэки.
Выполнение обработчиков then и catch
Даже если Promise уже resolved, колбэк выполнится асинхронно.
Очередь microtasks
Колбэки Promise всегда попадают в microtask queue.
console.log('start')
Promise.resolve().then(() => {
console.log('then')
})
console.log('end')
Результат:
start
end
then
влияет на порядок выполнения логики
помогает избегать race condition
важно при отладке асинхронного кода
Promise создаётся и настраивается синхронно, но его обработчики всегда выполняются асинхронно через очередь microtasks.