Вопрос: почему setTimeout выполняется быстрее Promise.then? - Академия Selectel

Вопрос: почему setTimeout выполняется быстрее Promise.then?

Линия поддержки
Линия поддержки Ответы на вопросы пользователей
29 сентября 2025

При исполнении, сначала выводится setTimeout, а потом Promise.then. Почему так происходит и как это исправить?

Изображение записи

Комментарий пользователя

Здравствуйте! У меня странный порядок исполнения: сначала выводится setTimeout, а потом Promise.then. Почему так происходит и каким образом можно отлаживать такую последовательность, чтобы понимать логику цикла и очередей в JS?

Максим Дубровский Пользователь

Ответ специалиста

Добрый день! Это редкий кейс и обычно происходит потому, что вы находитесь в другом окружении или используете дополнительно process.nextTick/promise shim. В браузере Promise.then — microtask и выполняется раньше setTimeout — macrotask.

Сделайте минимальный тест в чистом окружении (вставить в пустую страницу и открыть DevTools):

  • Евгений Полосухин

    Евгений Полосухин

    Ведущий разработчик


      console.log('a')
setTimeout(() => console.log('timeout'), 0)
Promise.resolve().then(() => console.log('promise'))
console.log('b')
// ожидаем: a b promise timeout

Если вывод другой — дело в окружении (инструменты, расширения).

Дальше нужно убедиться, что нет использования queueMicrotask/process.nextTick/MutationObserver в смешении, и что ваши консоль-логи не буферизуются (иногда devtools группирует вывод).

Затем в Node.js порядок немного другой: process.nextTick выполняется до Promise.then. В браузере process.nextTick нет — если вы запускаете код через bundler/eval/sourcemap, проверьте среду выполнения.

Для детальной трассировки вставляйте timestamps:


      const t = () => console.log(performance.now())
setTimeout(t, 0)
Promise.resolve().then(t)

Вывод покажет, что microtask все равно происходит раньше. Если наблюдаете обратное — проверьте сторонние библиотеки/полифиллы/инструменты запуска, они могут переопределять поведение.

Развивайте скилл JavaScript ежедневно, подпишитесь на рассылку Академии Selectel.