Назад к вопросам
IT One
Middle+
1
setTimeout(() => { console.log("timeOut"); }, 0) console.log(1); new Promise(resolve => { console.log("Promise"); setTimeout(() => { console.log("777"); resolve() }, 0) }).then(() => { console.log("then1"); }) .then(console.log('tratata')) .then(() => console.log("then2"); }) console.log(4); setTimeout(() => { console.log("timeOut2"); }, 0)
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Разберём порядок вывода в консоль для данного кода с учётом событийного цикла JavaScript:
setTimeout(() => {
console.log("timeOut");
}, 0)
console.log(1);
new Promise(resolve => {
console.log("Promise");
setTimeout(() => {
console.log("777");
resolve()
}, 0)
}).then(() => {
console.log("then1");
})
.then(console.log('tratata'))
.then(() =>
console.log("then2");
})
console.log(4);
setTimeout(() => {
console.log("timeOut2");
}, 0)
Пояснения:
console.log(1);иconsole.log(4);выполняются сразу, синхронно.- В конструкторе
new Promiseсинхронно вызываетсяconsole.log("Promise");. setTimeout(..., 0)ставит колбэки в очередь макротасков, которые выполнятся после текущего стека и микротасков.resolve()вызывается внутриsetTimeout, значитthenначнёт выполняться после этого таймаута.- В цепочке
.then(console.log('tratata'))— здесьconsole.log('tratata')вызывается сразу, а не как колбэк, потому что передаётся результат вызова, а не функция.
Итоговый порядок вывода:
1— синхронноPromise— синхронно внутри конструктора Promisetratata— сразу при вызовеthen(console.log('tratata'))4— синхронно
После завершения стека вызовов выполняются микротаски (промисы), но resolve ещё не вызван, так как он внутри setTimeout.
Далее выполняются макротаски (setTimeout):
timeOut— первый setTimeout777— внутри второго setTimeout, после чего вызываетсяresolve(), запускающий микротаск:then1— первый then после resolvethen2— последний thentimeOut2— последний setTimeout
Исправленный порядок вывода:
1
Promise
tratata
4
timeOut
777
then1
then2
timeOut2
Важный момент:
.then(console.log('tratata')) — это ошибка, так как console.log('tratata') вызывается сразу, а в then должен передаваться колбэк. Правильно:
.then(() => console.log('tratata'))
Это изменит порядок и логику выполнения.