Уже многие говорили о работе Javascript eventloop, но наиболее полно я смог понять работу модели параллелизма в следующем примере:

function init() {
//timer
const tymerStartTime = Date.now();
new Promise((resolve) => {
setTimeout(() => {
return resolve(Date.now())
}, 100000);
}).then((timerRunningTime) => {
console.log(`timer running time = ${timerRunningTime - tymerStartTime}`);
});
//cycle
const cycleStartTime = Date.now();
for (let count = 0; count < 1e10; count++) {}
const cycleRunningTime = Date.now();
console.log(`cycle running time = ${cycleRunningTime - cycleStartTime}`);
}
init()
view raw app.js hosted with ❤ by GitHub
  1. Сначала мы получаем время запуска таймера.
  2. Затем создается промис, где функция разрешения будет setTimeOut с таймером на 100 секунд (100000). После этого, когда таймер сработал, обработчик получает время работы таймера.
  3. Затем объявляется переменная, в нее записывается время начала цикла.
  4. Затем он выполняет цикл и присваивает количество итераций 1e10 (10 000 000 000).
  5. И на финише получаем время работы цикла.

Вывод показывает, что setTimeOut не дождался выполнения цикла. В противном случае время выполнения цикла было бы больше 120 000 миллисекунд. Эта реализация достигнута из-за того, что стек вызовов не был заблокирован, а обработка setTimeOut продолжалась в веб-API.