Вывод: 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 выполняется позже, поскольку текущие микрозадачи завершаются раньше отдельной задачи таймера.