📱 Отличие Promise.all() от Promise.allSettled()
Разработчики, которые работают с Promise в JS, в основном используют функцию all(). Но есть функция allSettled(), которая выполняет схожее действие, но с нюансом.
Но сначала небольшой ликбез: Промис (promise) – это специальный объект в JavaScript, представляющий собой результат асинхронной операции. Промисы позволяют работать с асинхронным кодом более удобным способом, избегая так называемых «коллбек-адов» (callback hell).
Когда вы создаете промис, он находится в одном из трех состояний:
1. Pending: Операция ещё выполняется. 2. Fulfilled: Операция завершилась успешно. 3. Rejected: Произошла ошибка.
Промисы используются для работы с сетевыми запросами
Отличие между Promise.all() и Promise.allSettled()
Функции Promise.all() и Promise.allSettled() выполняют схожую задачу: они принимают массив промисов и возвращают новый промис. Однако их поведение различается в случае ошибок.
Эта функция ожидает завершения всех промисов в переданном массиве. Если все промисы выполняются успешно, она возвращает массив результатов. Однако, если хотя бы один промис завершается с ошибкой, весь промис Promise.all() также завершается с этой ошибкой.
Пример:
`const promise1 = Promise.resolve('resolved1'); const promise2 = Promise.resolve('resolved2'); const promise3 = Promise.reject(new Error('error'));
Promise.all([promise1, promise2, promise3]) .then(values => { console.log(values); // Этот блок никогда не будет выполнен }) .catch(error => { console.error(error); // Ошибка будет поймана здесь });
Эта функция тоже ожидает завершения всех промисов в переданном массиве, но её поведение отличается тем, что она не прерывается при возникновении ошибки. Вместо этого она собирает результаты всех промисов, включая успешные и неуспешные, и возвращает массив объектов со статусом каждого промиса.
Пример:
`const promise1 = Promise.resolve('resolved1'); const promise2 = Promise.resolve('resolved2'); const promise3 = Promise.reject(new Error('error'));
Promise.allSettled([promise1, promise2, promise3])
.then(results => {
results.forEach(result => {
if (result.status === 'fulfilled') {
console.log(Fulfilled: ${result.value}); // resolved1, resolved2
} else {
console.error(Rejected: ${result.reason}); // error
}
});
});``