Sobes.tech
Назад к вопросам
Middle
3

setTimeout(function timeout() { console.log('Таймаут'); }, 0); let p = new Promise(function(resolve, reject) { console.log('Создание промиса'); resolve(); }); p.then(function(){ console.log('Обработка промиса'); }); console.log('Конец скрипта'); // Усложненный кейс // console.log(1); // setTimeout(() => console.log(2)); // Promise.resolve().then(() => console.log(3)); // Promise.resolve().then(() => setTimeout(() => console.log(4))); // Promise.resolve().then(() => console.log(5)); // setTimeout(() => console.log(6));

Компании, где спрашивали
IGaming

Ответ от нейросети

sobes.tech AI

Разберём порядок вывода в данном коде:

setTimeout(function timeout() {
  console.log('Таймаут');
}, 0);

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

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

console.log('Конец скрипта');
  1. Сначала выполняется весь синхронный код:

    • setTimeout ставит таймер с 0 задержкой (асинхронно).
    • Создаётся промис, при этом сразу выводится "Создание промиса".
    • Промис сразу резолвится.
    • Регистрируется обработчик .then (помещается в очередь микротасков).
    • Выводится "Конец скрипта".
  2. После выполнения синхронного кода выполняются микротаски (обработчики промисов):

    • Выводится "Обработка промиса".
  3. Затем выполняются макротаски (таймеры):

    • Выводится "Таймаут".

Итоговый порядок вывода:

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

Усложнённый кейс с комментариями:

console.log(1);

setTimeout(() => console.log(2));

Promise.resolve().then(() => console.log(3));

Promise.resolve().then(() => setTimeout(() => console.log(4)));

Promise.resolve().then(() => console.log(5));

setTimeout(() => console.log(6));

Пояснение:

  • Сначала синхронный console.log(1).
  • Затем ставятся таймеры на вывод 2 и 6 (макротаски).
  • Обработчики промисов (микротаски) выводят 3, ставят таймер на 4, выводят 5.

Порядок выполнения:

  1. 1 — синхронно
  2. Микротаски:
    • 3
    • 5
    • вторая микротаска ставит таймер на 4
  3. Макротаски:
    • 2
    • 6
    • 4 (после того, как таймер поставлен в микротаске)

Итоговый вывод:

1
3
5
2
6
4

Это демонстрирует, что микротаски выполняются сразу после синхронного кода, а макротаски — после микротасков, даже если таймеры с нулевой задержкой.