Gernar
JavaScript: асинхронность

Какие знаешь статические методы 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() подходит для этого, так как он дожидается завершения всех промисов и возвращает их результаты, независимо от успешности выполнения.

Содержание