Консоль выведет 1. Первый resolve фиксирует судьбу Promise; последующие resolve(2) и reject('error') уже не меняют его результат.
Поведение Promise при множественных вызовах resolve и reject
Консоль выведет 1. Первый resolve фиксирует судьбу Promise; последующие resolve(2) и reject('error') уже не меняют его результат.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разберите, что происходит с объектом Promise, если функции resolve() и reject() вызываются подряд несколько раз.
new Promise((resolve, reject) => {
resolve(1);
resolve(2);
reject('error');
}).then(
(value) => {
console.log(value);
},
(error) => {
console.log('error');
}
);
Опишите, какой результат будет выведен в консоль и почему дальнейшие вызовы resolve/reject не влияют на уже завершённый промис.
Ответ
Консоль выведет 1. Первый resolve фиксирует судьбу Promise; последующие resolve(2) и reject('error') уже не меняют его результат.
Executor продолжает выполняться после resolve, но сами повторные попытки завершения игнорируются. then вызывается асинхронно в микрозадаче и получает первое значение.
Это не означает, что resolve эквивалентен return: код после него, включая другие побочные эффекты, всё равно исполнится. Если первым resolve передан незавершённый Promise, внешний ещё может оставаться pending, но его дальнейшее завершение уже связано с переданным Promise; последующий reject также не переопределит выбор.