Микро и макрозадачи. Event loop

Согласно документации код выполняется по следующим правилам:

  1. Выбрать и исполнить старейшую задачу из очереди макрозадач.
  2. Исполнить все микрозадачи:
  3. Пока очередь микрозадач не пуста:
    • Выбрать из очереди и исполнить старейшую микрозадачу
  4. Отрисовать изменения страницы, если они есть.
  5. Если очередь макрозадач пуста – подождать, пока появится макрозадача.
  6. Перейти к шагу 1.
setTimeout(function timeout() {
    console.log('Таймаут');
}, 0);

let p = new Promise(function(resolve, reject) {
    console.log('Создание промиса');
    resolve();
});

p.then(function(){
    console.log('Обработка промиса');
});

console.log('Конец скрипта');

Результатом будет:

Создание промиса
Конец скрипта
Обработка промиса
Таймаут

Если settimeout - это макротаска, то почему она не выполнилась до обработки промиса, т.е:

Создание промиса
Конец скрипта
Таймаут
Обработка промиса

Ответы (2 шт):

Автор решения: Grundy

setTimeout - выполнился и запланировал новую большую задачу.

Переход к ее выполнению осуществляется, когда выполнились все маленькие задачки, созданные, внутри текущей большой.

→ Ссылка
Автор решения: Чернуцкий А.А.
// Макрозадача. Попадает в очередь макрозадач.
// Приоритет всегда отдается микрозадачам, то есть сначала 
// выполняются все микрозадачи, а потом макро.
setTimeout(function timeout() {
    console.log('Таймаут');
}, 0);

// Микрозадача (до resolve) не попадает в очередь микрозадач
let p = new Promise(function(resolve, reject) {
    console.log('Создание промиса');
resolve();
});

// Попадает в очередь микрозадач после Resolve
p.then(function(){
    console.log('Обработка промиса');
});

// Не попадает в очередь и выводится сразу
console.log('Конец скрипта');
→ Ссылка