> Почему нельзя просто вернуть Promise.resolve с промисом внутри в реализации any? (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Яндекс

Стек: JavaScript

> Пример ответа

В реализации Promise.any нельзя просто вернуть Promise.resolve(promise), потому что Promise.resolve оборачивает переданное значение в промис, но не ожидает его разрешения. Если передать в Promise.resolve уже существующий промис, он просто вернёт его же (или его обёртку), но не дождётся его выполнения.

Например:

JAVASCRIPT
const p = new Promise((resolve) => setTimeout(() => resolve('ok'), 1000));
const result = Promise.resolve(p);
console.log(result === p); // true - это тот же самый промис

Таким образом, Promise.resolve(p) не создаёт новый промис, который бы ждал p, а просто возвращает ссылку на p. В контексте any это означает, что мы не сможем корректно обработать состояние "все промисы отклонены" - нам нужно дождаться выполнения всех промисов, чтобы выбросить AggregateError, а не просто вернуть первый попавшийся промис.

Правильная реализация any должна создавать новый промис, который:

  • разрешается, когда любой из переданных промисов выполняется успешно (через resolve),
  • отклоняется с AggregateError, когда все промисы отклонены (после ожидания всех).

Поэтому используется ручное создание промиса с явными вызовами resolve и reject, а не Promise.resolve.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью