Комментарий пользователя
Здравствуйте! У меня странный порядок исполнения: сначала выводится 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.