Какие знаешь статические методы Promise
Разбор вопроса «Какие знаешь статические методы Promise» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.
Вопрос
Какие знаешь статические методы Promise
Профессия
Frontend Developer
Что хочет услышать интервьюер
Интервьюер хочет убедиться, что кандидат понимает все статические методы Promise и их различия, особенно в контексте обработки асинхронных операций. Важно показать знание современных методов (например, any(), allSettled()) и их практическое применение.
Ключевые тезисы
- Promise.all() — принимает массив промисов и возвращает новый промис, который выполнится, когда все промисы в массиве завершатся, или завершится с ошибкой, если хотя бы один промис отклонён.
- Promise.allSettled() — аналогичен Promise.all(), но ждёт завершения всех промисов (независимо от успешности) и возвращает массив результатов.
- Promise.race() — возвращает промис, который завершается или отклоняется с результатом первого завершённого промиса из переданного массива.
- Promise.any() — возвращает первый успешно выполнившийся промис из массива. Если все промисы отклонены, возвращает AggregateError.
- Promise.resolve() — создаёт успешно выполненный промис с переданным значением.
- Promise.reject() — создаёт промис, отклонённый с указанной причиной.
Подробный ответ
Статические методы Promise предоставляют удобные способы работы с коллекциями промисов. Promise.all() используется, когда нужно дождаться выполнения всех промисов и получить их результаты в виде массива. Если хотя бы один промис отклонён, весь Promise.all() немедленно отклоняется с этой ошибкой. Promise.allSettled(), в отличие от него, ждёт завершения всех промисов независимо от их статуса и возвращает массив объектов с результатами каждого промиса, что полезно для анализа всех исходов.
Promise.race() возвращает результат первого завершившегося промиса (неважно, успешно или с ошибкой). Это полезно для реализации таймаутов или выбора самого быстрого источника данных. Promise.any() похож на race, но возвращает первый успешно выполнившийся промис, игнорируя отклонённые, пока хотя бы один не выполнится успешно.
Promise.resolve() и Promise.reject() используются для создания уже завершённых промисов. Они часто применяются в тестах или для приведения значений к промисам в цепочках.
Практические примеры
Пример 1
Пример Promise.all() для параллельной загрузки данных:
const [user, posts] = await Promise.all([
fetch('/user'),
fetch('/posts')
]);Пример 2
Пример Promise.race() с таймаутом:
const data = await Promise.race([
fetch('/api'),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Timeout')), 5000)
)
]);Пример 3
Пример Promise.allSettled() для анализа результатов:
const results = await Promise.allSettled(promises);
const successful = results.filter(r => r.status === 'fulfilled');Частые ошибки
- Использование Promise.all() без обработки ошибок, что приводит к необработанным исключениям
- Путаница между Promise.race() и Promise.any(), особенно в сценариях с ошибками
- Непонимание, что Promise.allSettled() всегда завершается успешно, возвращая массив результатов
Связанные темы
- Цепочки промисов (Promise chaining)
- Async/await синтаксис
- Обработка ошибок в асинхронном коде
- Event Loop и механизм работы промисов
Follow-up вопросы
В чём разница между Promise.all() и Promise.allSettled()?
Уровень: basic
Promise.all() завершается с ошибкой, если хотя бы один промис отклонён, а Promise.allSettled() ждёт завершения всех промисов и возвращает массив результатов, включая статусы 'fulfilled' и 'rejected'.
Когда стоит использовать Promise.race() на практике?
Уровень: intermediate
Promise.race() полезен, когда нужно реагировать на первый завершённый промис, например, для реализации таймаутов или выбора самого быстрого источника данных.
Как обработать ситуацию, когда все промисы в Promise.any() отклонены?
Уровень: intermediate
Promise.any() возвращает AggregateError, который содержит массив ошибок всех отклонённых промисов. Его можно обработать в блоке catch или через .then(null, onRejected).
Можно ли передать не-промисы в статические методы Promise? Как они будут обработаны?
Уровень: advanced
Да, не-промисы автоматически оборачиваются в Promise.resolve(), поэтому методы работают с ними как с успешно выполненными промисами.
Какой метод Promise использовать для параллельного выполнения независимых задач с обработкой всех результатов?
Уровень: basic
Promise.allSettled() подходит для этого, так как он дожидается завершения всех промисов и возвращает их результаты, независимо от успешности выполнения.
Что такое Promise.race
Разбор вопроса «Что такое Promise.race» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.
Как устроена асинхронность в JavaScript
Разбор вопроса «Как устроена асинхронность в JavaScript» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.