JS выполняет одно задание в единицу времени.
Последовательность заданий формируется в стеке.
Цикл событий (Event Loop) - параллельные стеку процессы (в браузере или NodeJS), управляет формированием очереди для вставки в стек асинхронных заданий.
Цикл событий (Event Loop) имеет три отдельных очереди.
console.log('старт программы');
setTimeout(function() {
console.log('setTimeout 0');
}, 0);
Promise.resolve().then(function() {
console.log('promise');
}).then(function() {
console.log('следующий promise');
});
console.log('выход из потока');
console.log('выход из программы');