HTML / CSSJavaScriptNode jsПаттерны проектированияПрактические

Promise.all() & Promise.race()

Объект Promise в JavaScript предлагает несколько полезных встроенных методов, из которых два таких метода - Promise.all и Promise.race.

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

Promise.all - принимает множество обещаний и будет пытаться выполнить их все. Выходит раньше, если отклонено хотя бы одно обещание.

Promise.race - также принимает массив обещаний, но возвращает первое выполненное обещание. Урегулированное обещание может быть выполнено или отклонено.

Promise.all()

Цель дизайна Promise.all() - запустить множество промисов параллельно и дождаться, пока все они выполнятся. Например, когда пользователь входит в веб-приложение, такое как Facebook, вероятно, потребуется сделать несколько сетевых запросов для заполнения персонализированного контента пользователя:

Сценарий 1: Все переданные обещания выполняются

Сценарий 1. Все переданные обещания выполняются

Сценарий 2: Одно или несколько переданных обещаний отклоняются

Сценарий 2: Одно или несколько переданных обещаний отклоняются

Сценарий 3: Все переданные обещания отклоняются

Сценарий 3: ⚡️ Все переданные обещания отклоняются

1const userContent = [
2 new Promise(getFriendsList),
3 new Promise(getGroups),
4 new Promise(getLikedPages)
5];
6
7function initalizeUserContent() {
8 Promise.all(userContent)
9 .then(displayHomepage)
10 .catch(redirectLoginForm);
11};
12
13initalizeUserContent();

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

Promise.race()

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

Сценарий 1: Все переданные обещания выполняются

Scenario 1:  All passed-in Promises get fulfilled

Сценарий 2: Одно или несколько переданных обещаний отклоняются

Scenario 2:️ One or more of the passed-in Promise(s) rejects

Сценарий 3: Все переданные обещания отклоняются

Scenario 3: ⚡️ All passed-in Promises get rejected

Сценарий 4: передача пустого массива

Scenario 4: Passing an Empty iterable

Название метода Promise.race уместно, потому что оно заставляет все обещания «соревноваться» друг с другом только с одним победителем. 🏎️ Представьте, что вы разрабатываете программное обеспечение для покупки акций на бирже NASDAQ. Вы хотите иметь возможность отправлять покупки (так называемые «заказы на покупку») нескольким биржевым маклерам, но вы собираетесь отдать дань уважения только первому биржевому маклеру, который выполнит ваш заказ.

1const myStockBrokers = [
2 eTrade,
3 fidelity,
4 interactiveBrokers,
5 ameritrade,
6 tradeStation,
7 vanguard
8];
9
10function submitBuyOrder() {
11 Promise.race(myStockBrokers)
12 .then(updateMyPortfolio)
13 .catch(cancelBuyOrder);
14};
15
16submitBuyOrder();

Несколько примеров с Promise.all & Promise.race

Original source

Практика

Задание 1

Используя функцию isEvenOrOddAsync из предыдущей практики написать функцию которая обрабатывает массив

Функция должна принимать массив как параметр, а возвращать объект Где ключ объекта это элемент массива и значение odd, even, not a number

1function check(data){
2 return {}
3}
4
5check([1,2,3,"Hello"])
6
7/* console output
8{
9 1: "odd",
10 2: "even",
11 3: "odd"
12 "hello": "is not a number"
13}
14*/
Hello