Sobes.tech
Назад к вопросам
Middle
13

Каким методом промиса получить результат первого выполненного запроса?

Компании, где спрашивали
Автомакон

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Для получения результата первого завершившегося промиса используют Promise.race(). Он возвращает результат того промиса, который первым перейдёт в состояние fulfilled или rejected. Если нужен именно первый успешно выполненный запрос, дополнительно надо отфильтровать ошибки или обработать их отдельно.

Определение:

Promise.race() — это статический метод Promise, который принимает массив промисов и возвращает промис, завершающийся так же, как первый из переданных промисов. Важно: первым может оказаться не только успешный результат, но и ошибка. Поэтому для задачи “получить результат первого выполненного запроса” часто используют Promise.race() вместе с обработкой отказов или альтернативную логику, если нужен именно первый успешный ответ.

Пример использования:

const request1 = fetch('/api/user/1');
const request2 = fetch('/api/user/2');
const request3 = fetch('/api/user/3');

Promise.race([request1, request2, request3])
  .then(response => response.json())
  .then(data => {
    console.log('Первый завершившийся запрос:', data);
  })
  .catch(error => {
    console.error('Первым завершился запрос с ошибкой:', error);
  });

Пояснение кода:

  • Создаются три асинхронных запроса.
  • Promise.race([...]) отслеживает все промисы и ждёт тот, который завершится первым.
  • Если первым завершится успешный fetch, в then попадёт его ответ.
  • Если первым завершится ошибка, управление перейдёт в catch.

Если нужен именно первый успешный результат, а не просто первый завершившийся, то Promise.race() в чистом виде не всегда подходит: отказавшийся промис может “выиграть гонку”.

Ключевые моменты:

  • Promise.race() возвращает результат первого завершившегося промиса.
  • Победителем может быть как fulfilled, так и rejected.
  • Для “первого успешного ответа” нужно отдельно учитывать ошибки.
  • Метод полезен для таймаутов, резервных источников данных и параллельных запросов.
  • Если важен именно первый успешный результат без учёта ошибок, часто требуется дополнительная обвязка над Promise.race().