Назад к вопросам
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('Конец скрипта');
-
Сначала выполняется весь синхронный код:
setTimeoutставит таймер с 0 задержкой (асинхронно).- Создаётся промис, при этом сразу выводится "Создание промиса".
- Промис сразу резолвится.
- Регистрируется обработчик
.then(помещается в очередь микротасков). - Выводится "Конец скрипта".
-
После выполнения синхронного кода выполняются микротаски (обработчики промисов):
- Выводится "Обработка промиса".
-
Затем выполняются макротаски (таймеры):
- Выводится "Таймаут".
Итоговый порядок вывода:
Создание промиса
Конец скрипта
Обработка промиса
Таймаут
Усложнённый кейс с комментариями:
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— синхронно- Микротаски:
35- вторая микротаска ставит таймер на
4
- Макротаски:
264(после того, как таймер поставлен в микротаске)
Итоговый вывод:
1
3
5
2
6
4
Это демонстрирует, что микротаски выполняются сразу после синхронного кода, а макротаски — после микротасков, даже если таймеры с нулевой задержкой.