В чём разница между Promise.all и Promise.race?
Когда мы говорим о 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); // 'Ошибка: Ошибка'
});
Сравнение и практические советы
-
Сценарий использования:
- Используйте
Promise.all, когда вам нужно дождаться завершения всех Promise и получить их результаты. - Используйте
Promise.race, когда вам важен только первый завершившийся Promise, например, в случае таймаутов или запросов к API.
- Используйте
-
Обработка ошибок:
- С
Promise.allвы можете обработать ошибки для всех Promise сразу. Если один из них отклоняется, вы получите ошибку, не дожидаясь завершения остальных. - С
Promise.race, вы можете получить результат как успешного, так и отклонённого Promise, но только первого, который завершится.
- С
-
Распространённые ошибки:
- Не забывайте, что
Promise.allтребует, чтобы все переданные значения были Promise. Если вы передадите обычное значение, оно будет преобразовано в Promise автоматически. - Будьте осторожны с
Promise.race, так как он может вернуть ошибку из первого отклонённого Promise и игнорировать оставшиеся.
- Не забывайте, что
Понимание различий и правильное использование этих методов может значительно упростить работу с асинхронным кодом в JavaScript и улучшить производительность вашего приложения.