Какие знаешь статические методы промисов?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Статические методы Промисов в 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() | Первого успеха | AggregateError | Fallback'и |
Практические примеры
Загрузка с 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() — отклоняется только если все ошибки
Выбор метода зависит от логики приложения и требований к обработке ошибок.