SobesLab логотип SobesLab

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

Promise.all

Описание

Promise.all принимает массив (или любой итерируемый объект) Promise и возвращает новый Promise. Этот новый Promise выполняется, когда все переданные Promise завершены успешно, или отклоняется, если хотя бы один из них отклонён.

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

  • Возврат: Новый Promise возвращает массив результатов каждого переданного Promise в порядке их появления.
  • Успех: Если все Promise выполняются успешно, Promise, возвращаемый Promise.all, также будет выполнен.
  • Ошибка: Если один из Promise отклоняется, Promise.all немедленно отклоняется с ошибкой этого Promise, игнорируя остальные.

Пример

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'foo'));

Promise.all([promise1, promise2, promise3])
  .then(values => {
    console.log(values); // [3, 42, 'foo']
  })
  .catch(error => {
    console.error('Ошибка:', error);
  });

Promise.race

Описание

Promise.race также принимает массив (или любой итерируемый объект) Promise, но возвращает новый Promise, который выполняется или отклоняется по результату первого завершившегося Promise.

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

  • Возврат: Новый Promise возвращает результат первого завершившегося Promise (либо выполненного, либо отклонённого).
  • Скорость: Этот метод полезен, когда вам нужно, чтобы выполнение зависело от первого завершившегося Promise, независимо от того, успешно он завершился или нет.

Пример

const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'Первый'));
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'Ошибка'));

Promise.race([promise1, promise2])
  .then(result => {
    console.log(result); // Вывод не будет, так как promise2 отклонится первым
  })
  .catch(error => {
    console.error('Ошибка:', error); // 'Ошибка: Ошибка'
  });

Сравнение и практические советы

  1. Сценарий использования:

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

    • С Promise.all вы можете обработать ошибки для всех Promise сразу. Если один из них отклоняется, вы получите ошибку, не дожидаясь завершения остальных.
    • С Promise.race, вы можете получить результат как успешного, так и отклонённого Promise, но только первого, который завершится.
  3. Распространённые ошибки:

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

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

Как расширить ответ на собеседовании

Добавьте практический пример

Поделитесь кейсом из проекта, где вы применяли знание из вопроса. Структура: задача → действия → результат.

Укажите альтернативы

Расскажите о вариантах реализации, плюсах и минусах, а также о критериях выбора подхода.

Сделайте вывод

Завершите ответ кратким резюме: где применимо, какие риски и что важно помнить на практике.

Смежные категории

Рекомендуемые категории

Дополнительные материалы