Определите, какой вывод появится в консоли при выполнении кода

Вывод: 2, 4, 3, 1. Вложенный Promise успешно разрешается значением 3, а внешний принимает его состояние и передаёт 3 в then.

Короткий ответ

Что ответить на собеседовании

Вывод: 2, 4, 3, 1. Вложенный Promise успешно разрешается значением 3, а внешний принимает его состояние и передаёт 3 в then.

Подробный разбор

Ответ с пояснениями

Условие

Нужно предсказать, какие значения будут напечатаны в консоли после запуска следующего фрагмента JavaScript. Обратите внимание на порядок выполнения setTimeout, промисов и синхронных операторов.

setTimeout(() => {
  console.log(1);
});

const promise = new Promise((resolve) => {
  console.log(2);
  resolve(new Promise((resolve) => {
    resolve(3);
  }));
});

promise.then(message => {
  console.log(message);
});

console.log(4);

Ответ

Вывод: 2, 4, 3, 1. Вложенный Promise успешно разрешается значением 3, а внешний принимает его состояние и передаёт 3 в then.

Executor внешнего Promise немедленно выводит 2. Executor внутреннего тоже запускается синхронно, но ничего не печатает. Следом выполняется синхронный console.log(4).

Разрешение внешнего Promise другим Promise не передаёт объект как обычное конечное значение: состояние усваивается асинхронным механизмом Promise. После соответствующих микрозадач then выводит 3. Таймер с 1 выполняется позже, поскольку текущие микрозадачи завершаются раньше отдельной задачи таймера.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее