Вопрос проверяет понимание комбинирования методов Promise.all и Promise.race для управления временем выполнения асинхронных операций.
Для реализации логики «выполнить все запросы, но прервать, если они занимают дольше заданного времени» можно использовать комбинацию Promise.all и Promise.race. Promise.all ожидает выполнения всех промисов, а Promise.race завершается при первом выполненном или отклонённом промисе. Создав промис таймаута, который отклоняется через заданное время, мы можем обернуть Promise.all в Promise.race.
function fetchWithTimeout(urls, timeoutMs) {
const fetchPromises = urls.map(url => fetch(url));
const timeoutPromise = new Promise((_, reject) =>
setTimeout(() => reject(new Error('Timeout')), timeoutMs)
);
return Promise.race([Promise.all(fetchPromises), timeoutPromise]);
}
// Использование
fetchWithTimeout(['url1', 'url2'], 5000)
.then(responses => console.log('Все запросы выполнены'))
.catch(err => console.error('Таймаут или ошибка:', err));В этом примере Promise.all ожидает все fetch-запросы, а Promise.race завершается либо результатом Promise.all, либо ошибкой таймаута. Если таймаут срабатывает раньше, все запросы не отменяются автоматически, но основной поток управления прерывается.
Promise.race не отменяет другие промисы. Запросы продолжают выполняться, но их результаты игнорируются. Для реальной отмены нужны дополнительные механизмы (например, AbortController).Promise.all отклонится, и Promise.race вернёт эту ошибку.Комбинация Promise.all и Promise.race — простой и эффективный способ добавить таймаут к группе асинхронных операций. Это полезно в сценариях, где критично время выполнения, например, при загрузке данных с нескольких источников или в микросервисной архитектуре.
Уровень
Рейтинг:
4
Сложность:
6
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию