Поведение Promise при множественных вызовах resolve и reject

Консоль выведет 1. Первый resolve фиксирует судьбу Promise; последующие resolve(2) и reject('error') уже не меняют его результат.

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

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

Консоль выведет 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 также не переопределит выбор.

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

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

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

Подробнее