Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: Promise.race, JavaScript, asynchronous, promises, concurrency

Что делает Promise.race?

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

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

Promise.race — это статический метод, который принимает массив (или итерируемый объект) промисов и возвращает новый промис. Этот новый промис завершается (разрешается или отклоняется) с тем же результатом, что и первый завершившийся промис из переданного списка. Это полезно для реализации таймаутов или когда нужен результат от самого быстрого источника данных.

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

Promise.race — это мощный инструмент для управления асинхронными операциями в JavaScript, позволяющий реагировать на результат самого быстрого из нескольких промисов.

Как работает Promise.race

Метод принимает итерируемый объект (чаще всего массив) промисов. Он немедленно возвращает новый промис. Этот новый промис "связывается" с судьбой первого промиса из переданного списка, который перейдёт в состояние fulfilled (выполнен) или rejected (отклонён). Как только любой из исходных промисов завершается, результат (значение или причина ошибки) передаётся в возвращённый промис от race, и все остальные промисы игнорируются в контексте этого вызова.

Практическое применение

  • Таймауты для операций: Вы можете создать "гонку" между полезным промисом (например, запросом к API) и промисом, который отклоняется через определённое время. Если запрос выполняется дольше таймаута, пользователь получит ошибку времени ожидания.
  • Выбор самого быстрого источника: Если у вас есть несколько серверов или CDN, предоставляющих одни и те же данные, можно отправить запросы ко всем и использовать результат от того, кто ответит первым.

Пример кода с таймаутом

// Полезная асинхронная операция (например, fetch)
const fetchData = fetch('https://api.example.com/data');

// Промис, который отклоняется через 5 секунд
const timeout = new Promise((_, reject) => {
    setTimeout(() => reject(new Error('Request timeout')), 5000);
});

// Гонка между запросом и таймаутом
Promise.race([fetchData, timeout])
    .then(response => {
        console.log('Данные получены:', response);
    })
    .catch(error => {
        console.error('Ошибка или таймаут:', error.message);
    });

В этом примере, если fetchData завершится раньше 5 секунд, в then попадёт его результат. Если же запрос длится дольше, сработает таймаут, и выполнится блок catch с ошибкой "Request timeout".

Важные нюансы

  • Promise.race не отменяет остальные промисы — они продолжат выполняться в фоне, но их результаты будут проигнорированы.
  • Если передать пустой массив, возвращённый промис никогда не завершится, так как не с чем "состязаться".
  • Этот метод часто используется в паре с Promise.all (который ждёт всех) и Promise.any (который ждёт первого успешного).

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

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

#Promise.race

#JavaScript

#asynchronous

#promises

#concurrency

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