📱 Отличие 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()

Эта функция ожидает завершения всех промисов в переданном массиве. Если все промисы выполняются успешно, она возвращает массив результатов. Однако, если хотя бы один промис завершается с ошибкой, весь промис 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); // Ошибка будет поймана здесь });

Promise.allSettled()

Эта функция тоже ожидает завершения всех промисов в переданном массиве, но её поведение отличается тем, что она не прерывается при возникновении ошибки. Вместо этого она собирает результаты всех промисов, включая успешные и неуспешные, и возвращает массив объектов со статусом каждого промиса.

Пример:

`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 } }); });``