Синхронный и асинхронный код
Синхронный код — выполняется последовательно, строчка за строчкой.
Если одна операция выполняется долго, весь поток ждёт её завершения.
Такую операцию можно назвать блокирующей.
Асинхронный код — позволяет выполнять часть работы “в фоне”: длительная операция передаётся окружению (браузеру или Node), а JS продолжает выполнение.
Когда операция завершена, её результат попадает в очередь задач, и движок выполняет callback.
Асинхронные операции (таймеры, сетевые запросы) выполняет окружение, а не сам движок JS.
Но сам промис — часть JS-движка: его then попадает в microtask queue, а не в окружение.
Пример
console.log(1);
Promise.resolve().then(() => console.log(4)); // микрозадача
console.log(2);
console.log(3);
// Вывод: 1, 2, 3, 4