Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: timeout, promise, race, abort, concurrency

Если один из запросов в пачке зависает — отменять его по таймауту или ждать завершения?

Вопрос проверяет понимание стратегий обработки зависших запросов в параллельных или пачечных операциях, что важно для обеспечения отказоустойчивости и производительности приложений.

Короткий ответ

Лучше отменять зависший запрос по таймауту, чтобы не блокировать ресурсы и не задерживать выполнение остальных запросов. Ожидание завершения может привести к зависанию всего приложения или пулу потоков. Используйте Promise.race с таймером или AbortController для отмены.

Длинный ответ

Проблема зависших запросов

Когда вы отправляете пачку запросов (например, параллельные HTTP-вызовы), один из них может зависнуть из-за сетевых проблем, ошибок сервера или бесконечного цикла. Если просто ждать его завершения, весь процесс блокируется, что может привести к утечкам памяти, зависанию интерфейса или исчерпанию пула соединений.

Решение: таймаут и отмена

Оптимальная стратегия — установить таймаут для каждого запроса. Если запрос не завершился за отведённое время, его следует отменить. Это позволяет освободить ресурсы и продолжить обработку остальных запросов. В JavaScript для этого можно использовать AbortController или Promise.race с таймером.

Пример кода

async function fetchWithTimeout(url, timeoutMs = 5000) {
  const controller = new AbortController();
  const timeoutId = setTimeout(() => controller.abort(), timeoutMs);

  try {
    const response = await fetch(url, { signal: controller.signal });
    return response.json();
  } catch (error) {
    if (error.name === 'AbortError') {
      console.log('Запрос отменён по таймауту');
    }
    throw error;
  } finally {
    clearTimeout(timeoutId);
  }
}

// Использование для пачки запросов
const urls = ['/api/data1', '/api/data2', '/api/data3'];
const promises = urls.map(url => fetchWithTimeout(url, 3000));
const results = await Promise.allSettled(promises);

Когда применять

Таймауты и отмена запросов критичны в микросервисной архитектуре, при работе с внешними API, в real-time приложениях и при обработке больших объёмов данных. Это повышает отказоустойчивость и предотвращает каскадные сбои.

Вывод: всегда используйте таймауты для внешних запросов и отменяйте зависшие, чтобы не блокировать систему. Ожидание завершения оправдано только в синхронных блокирующих операциях с гарантированным временем выполнения.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

Ключевые слова

#timeout

#promise

#race

#abort

#concurrency

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию