Sobes.tech
Назад к вопросам
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)

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

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

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. 1 — синхронно
  2. Promise — синхронно внутри конструктора Promise
  3. tratata — сразу при вызове then(console.log('tratata'))
  4. 4 — синхронно

После завершения стека вызовов выполняются микротаски (промисы), но resolve ещё не вызван, так как он внутри setTimeout.

Далее выполняются макротаски (setTimeout):

  1. timeOut — первый setTimeout
  2. 777 — внутри второго setTimeout, после чего вызывается resolve(), запускающий микротаск:
  3. then1 — первый then после resolve
  4. then2 — последний then
  5. timeOut2 — последний setTimeout

Исправленный порядок вывода:

1
Promise
tratata
4
timeOut
777
then1
then2
timeOut2

Важный момент:

.then(console.log('tratata')) — это ошибка, так как console.log('tratata') вызывается сразу, а в then должен передаваться колбэк. Правильно:

.then(() => console.log('tratata'))

Это изменит порядок и логику выполнения.