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

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

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

Стек: JavaScript

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

Для обработки двух асинхронных запросов с условиями success, fail и timeout можно использовать комбинацию Promise.allSettled и AbortController с тайм-аутом. Пример:

JAVASCRIPT
async function handleRequests(url1, url2, timeoutMs = 5000) {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
const request1 = fetch(url1, { signal: controller.signal })
.then(res => ({ status: 'success', data: res }))
.catch(err => {
if (err.name === 'AbortError') return { status: 'timeout' };
return { status: 'fail', error: err };
});
const request2 = fetch(url2, { signal: controller.signal })
.then(res => ({ status: 'success', data: res }))
.catch(err => {
if (err.name === 'AbortError') return { status: 'timeout' };
return { status: 'fail', error: err };
});
const results = await Promise.allSettled([request1, request2]);
clearTimeout(timeoutId);
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
const { status, data, error } = result.value;
console.log(`Запрос ${index + 1}: ${status}`, data || error);
} else {
console.log(`Запрос ${index + 1}: неожиданная ошибка`, result.reason);
}
});
return results;
}

Этот код:

  • Использует AbortController для отмены обоих запросов при превышении тайм-аута.
  • Обрабатывает каждый запрос отдельно, возвращая объект с полем status (success/fail/timeout).
  • Применяет Promise.allSettled для ожидания завершения обоих запросов независимо от их результата.
  • Очищает таймер после завершения всех запросов.

Для более сложной логики (например, разное время тайм-аута для каждого запроса) можно создать отдельные контроллеры.

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

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