Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: Promise.all, Promise.race, timeout, async, error handling

Как совместить Promise.all и Promise.race для реализации логики: «выполнить все запросы, но прервать, если они занимают дольше заданного времени»?

Вопрос проверяет понимание комбинирования методов Promise.all и Promise.race для управления временем выполнения асинхронных операций.

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

Можно создать массив промисов и передать его в Promise.all, а затем обернуть результат в Promise.race с промисом таймаута. Если таймаут срабатывает раньше, Promise.race завершается с ошибкой, что прерывает выполнение. Это позволяет ограничить общее время выполнения группы запросов.

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

Комбинирование 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 вернёт эту ошибку.
  • Гибкость: Можно адаптировать для любых асинхронных операций, не только fetch.

Вывод

Комбинация Promise.all и Promise.race — простой и эффективный способ добавить таймаут к группе асинхронных операций. Это полезно в сценариях, где критично время выполнения, например, при загрузке данных с нескольких источников или в микросервисной архитектуре.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

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

#Promise.all

#Promise.race

#timeout

#async

#error handling

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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