> Как обработать результаты двух асинхронных запросов с условиями success, fail и timeout в JavaScript? (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Яндекс
Стек: JavaScript
> Пример ответа
Для обработки двух асинхронных запросов с условиями success, fail и timeout можно использовать комбинацию Promise.allSettled и AbortController с тайм-аутом. Пример:
JAVASCRIPTasync 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для ожидания завершения обоих запросов независимо от их результата. - Очищает таймер после завершения всех запросов.
Для более сложной логики (например, разное время тайм-аута для каждого запроса) можно создать отдельные контроллеры.
> Похожие задачи по frontend
Как обрабатывать массив результатов промисов в JavaScript и выводить success или fail в консоль
Как обработать ошибку, если хотя бы один из нескольких запросов не ответил в JavaScript?
Как обрабатывать превышение лимита вызовов функции в JavaScript и что возвращать
Как реализовать метод перезагрузки счетчика вызовов функции в декораторе JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью