Этот вопрос проверяет знание utility методов класса Promise для работы с коллекциями промисов.
Основные статические методы Promise: Promise.all() для ожидания всех промисов, Promise.race() для первого завершившегося, Promise.allSettled() для всех результатов (успешных и неудачных), Promise.any() для первого успешного, Promise.resolve() и Promise.reject() для создания сразу resolved/rejected промисов.
Статические методы Promise предоставляют мощные инструменты для работы с множеством асинхронных операций.
Методы для коллекций:
Promise.all() - все успешно:
const promises = [
fetch('/api/users'),
fetch('/api/products'),
fetch('/api/orders')
];
Promise.all(promises)
.then(([users, products, orders]) => {
// Все промисы выполнены успешно
})
.catch(error => {
// Хотя бы один промис отклонен
});Promise.race() - первый завершившийся:
const timeout = new Promise((_, reject) => {
setTimeout(() => reject(new Error('Timeout')), 5000);
});
Promise.race([fetch('/api/data'), timeout])
.then(data => {
// fetch завершился раньше timeout
})
.catch(error => {
// timeout сработал раньше
});Promise.allSettled() - все результаты:
const promises = [promise1, promise2, promise3];
Promise.allSettled(promises)
.then(results => {
results.forEach(result => {
if (result.status === 'fulfilled') {
console.log('Успех:', result.value);
} else {
console.log('Ошибка:', result.reason);
}
});
});Promise.any() - первый успешный:
const mirrors = [
fetch('https://mirror1.com/data'),
fetch('https://mirror2.com/data'),
fetch('https://mirror3.com/data')
];
Promise.any(mirrors)
.then(data => {
// Первый успешный ответ
})
.catch(errors => {
// Все промисы отклонены
});Методы создания:
Promise.resolve() - успешный промис:
const resolved = Promise.resolve(42);
// Эквивалентно: new Promise(resolve => resolve(42))
// Использование для кэширования
const cache = new Map();
function getData(key) {
if (cache.has(key)) {
return Promise.resolve(cache.get(key));
}
return fetchData(key);
}Promise.reject() - промис с ошибкой:
const rejected = Promise.reject(new Error('Failure'));
// Эквивалентно: new Promise((_, reject) => reject(error))