> Как обработать ошибку, если хотя бы один из нескольких запросов не ответил в JavaScript? (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Яндекс

Стек: JavaScript

> Пример ответа

Для обработки ситуации, когда хотя бы один из нескольких запросов не ответил (например, из-за таймаута или сетевой ошибки), используйте Promise.allSettled() или комбинацию Promise.all() с индивидуальными обработчиками ошибок.

Пример с Promise.allSettled():
Этот метод ждет завершения всех промисов и возвращает массив объектов с результатами (status: "fulfilled" или status: "rejected"). Вы можете проверить, есть ли хотя бы один отклоненный запрос.

JAVASCRIPT
async function handleRequests(urls) {
const promises = urls.map(url => fetch(url).then(res => res.json()));
const results = await Promise.allSettled(promises);
const hasError = results.some(result => result.status === 'rejected');
if (hasError) {
console.error('Хотя бы один запрос не ответил');
// Дополнительная логика: повтор, логирование, частичная обработка
}
// Обработка успешных результатов
const successfulData = results
.filter(result => result.status === 'fulfilled')
.map(result => result.value);
return successfulData;
}

Альтернатива с Promise.all() и catch:
Если нужно прервать выполнение при первой ошибке, используйте Promise.all(), но добавьте индивидуальные обработчики, чтобы преобразовать ошибки в успешные значения (например, null).

JAVASCRIPT
async function handleRequests(urls) {
const promises = urls.map(url =>
fetch(url)
.then(res => res.json())
.catch(() => null) // заменяем ошибку на null
);
const results = await Promise.all(promises);
if (results.some(result => result === null)) {
console.error('Хотя бы один запрос не ответил');
}
return results.filter(result => result !== null);
}

Ключевые моменты:

  • Promise.allSettled() - лучший выбор, если нужно дождаться всех запросов и обработать частичные результаты.
  • Promise.all() с catch - подходит, если ошибка одного запроса не должна блокировать остальные.
  • Для таймаутов используйте AbortController или обертку с setTimeout.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью