> Почему нельзя просто вернуть Promise.resolve с промисом внутри в реализации any? (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Яндекс
Стек: JavaScript
> Пример ответа
В реализации Promise.any нельзя просто вернуть Promise.resolve(promise), потому что Promise.resolve оборачивает переданное значение в промис, но не ожидает его разрешения. Если передать в Promise.resolve уже существующий промис, он просто вернёт его же (или его обёртку), но не дождётся его выполнения.
Например:
JAVASCRIPTconst 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.
> Похожие задачи по frontend
В каком порядке выполняются промисы и их обработчики then/catch в JavaScript и как это влияет на порядок ошибок?
Как определить момент завершения всех промисов с ошибками для вызова reject в JavaScript?
Как повесить обработчик на резолв каждого промиса в массиве для реализации any?
Что произойдет при прямой мутации состояния в редьюсере Redux
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью