← Назад к вопросам

Какие знаешь статические методы промисов?

1.0 Junior🔥 281 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Статические методы Промисов в JavaScript

Промисы предоставляют несколько полезных статических методов для работы с несколькими асинхронными операциями одновременно. Эти методы упрощают обработку сложных сценариев асинхронного программирования.

1. Promise.all()

Ждёт выполнения всех промисов. Если хотя бы один отклонится, вся цепь отклоняется:

const promise1 = fetch('/user');
const promise2 = fetch('/posts');
const promise3 = fetch('/comments');

Promise.all([promise1, promise2, promise3])
  .then(([user, posts, comments]) => {
    // Все успешно
  })
  .catch(err => {
    // Одна из ошибок
  });

Использование: загрузка нескольких ресурсов, которые все нужны

2. Promise.allSettled()

Ожидает выполнения всех промисов, независимо от результата:

Promise.allSettled([promise1, promise2, promise3])
  .then(results => {
    results.forEach(result => {
      if (result.status === 'fulfilled') {
        console.log('Успех:', result.value);
      } else {
        console.log('Ошибка:', result.reason);
      }
    });
  });

Результат: массив объектов с status и value/reason

Использование: когда нужны результаты всех операций, даже если некоторые падают

3. Promise.race()

Возвращает результат первого завершённого промиса:

const timeout = new Promise((_, reject) =>
  setTimeout(() => reject('Timeout'), 5000)
);

const fetchData = fetch('/api/data');

Promise.race([fetchData, timeout])
  .then(result => console.log('Успешно:', result))
  .catch(err => console.log('Ошибка:', err));

Использование: timeout'ы, выбор быстрейшего источника данных

4. Promise.any()

Возвращает результат первого успешного промиса. Если все отклоняются, возвращает AggregateError:

const provider1 = fetch('https://api1.com');
const provider2 = fetch('https://api2.com');
const provider3 = fetch('https://api3.com');

Promise.any([provider1, provider2, provider3])
  .then(result => console.log('Данные получены:', result))
  .catch(errors => console.log('Все источники упали:', errors.errors));

Использование: fallback'и, выбор доступного источника

5. Promise.resolve()

Возвращает разрешённый промис с переданным значением:

Promise.resolve(42)
  .then(value => console.log(value)); // 42

Promise.resolve(anotherPromise)
  .then(result => {
    // Результат anotherPromise
  });

Использование: обёртка обычного значения в промис, цепочка

6. Promise.reject()

Возвращает отклонённый промис с переданной ошибкой:

Promise.reject(new Error('Что-то пошло не так'))
  .catch(err => console.log('Ошибка:', err.message));

Сравнение методов

МетодЖдётПри ошибкеИспользование
all()ВсехОтклоняетВсе нужны
allSettled()ВсехВозвращает результатыНужны результаты все
race()ПервогоОшибка первогоТаймауты
any()Первого успехаAggregateErrorFallback'и

Практические примеры

Загрузка с fallback'ом

const loadImage = (url) => 
  Promise.race([
    fetch(url),
    new Promise((_, reject) => 
      setTimeout(() => reject('Timeout'), 3000)
    )
  ]);

Загрузка из нескольких источников

const data = await Promise.any([
  fetch('https://primary.api/data'),
  fetch('https://secondary.api/data'),
  fetch('https://backup.api/data')
]);

Отчёт о нескольких операциях

const results = await Promise.allSettled([
  saveUser(user),
  saveSettings(settings),
  uploadAvatar(avatar)
]);

const failed = results.filter(r => r.status === 'rejected');
if (failed.length) {
  notifyUser('Некоторые операции не выполнились');
}

Важные моменты

  • Promise.all() — бросает на первую ошибку
  • Promise.allSettled() — никогда не отклоняется
  • Promise.race() — рискованно использовать для обработки ошибок
  • Promise.any() — отклоняется только если все ошибки

Выбор метода зависит от логики приложения и требований к обработке ошибок.