Что такое Promise и чем отличаются Promise.all, allSettled, race и any?
- Какие состояния бывают у промиса?
Promise — объект будущего результата в одном из состояний: pending, fulfilled, rejected; состояние меняется один раз. then/catch/finally возвращают новый промис — получаются цепочки. all — все успешны или первая ошибка; allSettled — дождаться всех и получить статусы; race — первый завершившийся (успех или ошибка); any — первый успешный.
- Ошибка в then пропускает последующие then до ближайшего catch
- Необработанный rejected — событие unhandledrejection
- Promise.all не отменяет остальные запросы — для отмены AbortController
А ещё Обёртка над колбэчным API: new Promise((resolve, reject) => ...)
Подробно
Зачем. Колбэки вкладываются друг в друга («ад колбэков»), ошибки приходится передавать вручную. Промисы дают цепочки и единый канал ошибок.
Цепочка: значение, возвращённое из then, становится результатом следующего промиса; возвращённый промис «разворачивается»; брошенное исключение превращается в rejected.
Комбинаторы:
| результат | при ошибке | |
|---|---|---|
| all | массив значений | отклоняется первой ошибкой |
| allSettled | массив {status, value/reason} | не отклоняется |
| race | первый завершившийся | если первым была ошибка — она |
| any | первый успешный | AggregateError, если все упали |
Все комбинаторы ждут промисы, которые уже запущены: «отменить» остальные они не могут — нужен AbortController для fetch.
Пример
const [user, orders] = await Promise.all([fetchUser(id), fetchOrders(id)]);
const results = await Promise.allSettled(urls.map(u => fetch(u)));
const ok = results.filter(r => r.status === "fulfilled").map(r => r.value);
const timeout = ms => new Promise((_, rej) => setTimeout(() => rej(new Error("timeout")), ms));
await Promise.race([fetch(url), timeout(3000)]);Что хотят услышать
- Состояния и цепочки.
- Различие четырёх комбинаторов.
- Обработка ошибок.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Promise.all ждёт все промисы даже после ошибки и возвращает статусы, а allSettled — первую ошибку
- ✗Состояние промиса может меняться многократно
- ✓all — все или первая ошибка, allSettled — статусы всех, race — первый, any — первый успешный
- ✗race возвращает первый успешный промис, игнорируя ошибки
Что спросят дальше
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.