Skip to content

Commit 79503ec

Browse files
authored
+ Promise.any
1 parent afb71de commit 79503ec

File tree

1 file changed

+39
-2
lines changed

1 file changed

+39
-2
lines changed

1-js/11-async/05-promise-api/article.md

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Promise API
22

3-
В классе `Promise` есть 5 статических методов. Давайте познакомимся с ними.
3+
В классе `Promise` есть 6 статических методов. Давайте познакомимся с ними.
44

55
## Promise.all
66

@@ -205,7 +205,7 @@ if(!Promise.allSettled) {
205205
206206
## Promise.race
207207
208-
Метод очень похож на `Promise.all`, но ждёт только первый выполненный промис, из которого берёт результат (или ошибку).
208+
Метод очень похож на `Promise.all`, но ждёт только первый *выполненный* промис, из которого берёт результат (или ошибку).
209209
210210
Синтаксис:
211211
@@ -225,6 +225,43 @@ Promise.race([
225225
226226
Быстрее всех выполнился первый промис, он и дал результат. После этого остальные промисы игнорируются.
227227
228+
## Promise.any
229+
230+
Метод очень похож на `Promise.race`, но ждёт только первый *успешно выполненный* промис, из которого берёт результат. Если ни один из переданных промисов не завершится успешно, тогда возвращённый объект Promise будет отклонён с помощью [`AggregateError`](mdn:js/AggregateError) – специального объекта ошибки, который хранит все ошибки промисов в свойстве `errors`.
231+
232+
Синтаксис:
233+
234+
```js
235+
let promise = Promise.any(iterable);
236+
```
237+
238+
Например, здесь, результатом будет `1`:
239+
240+
```js run
241+
Promise.any([
242+
new Promise((resolve, reject) => setTimeout(() => reject(new Error("Ошибка!")), 1000)),
243+
new Promise((resolve, reject) => setTimeout(() => resolve(1), 2000)),
244+
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
245+
]).then(alert); // 1
246+
```
247+
248+
Первый промис в этом примере был самым быстрым, но он был отклонён, поэтому результатом стал второй. После того, как первый успешно выполненный промис "выиграет гонку", все дальнейшие результаты будут проигнорированы.
249+
250+
Вот пример, в котором все промисы отклоняются:
251+
252+
```js run
253+
Promise.any([
254+
new Promise((resolve, reject) => setTimeout(() => reject(new Error("Ошибка!")), 1000)),
255+
new Promise((resolve, reject) => setTimeout(() => reject(new Error("Ещё одна ошибка!")), 2000))
256+
]).catch(error => {
257+
console.log(error.constructor.name); // AggregateError
258+
console.log(error.errors[0]); // Error: Ошибка!
259+
console.log(error.errors[1]); // Error: Ещё одна ошибка!
260+
});
261+
```
262+
263+
Как вы можете видеть, объекты ошибок для отклонённых промисов доступны в свойстве `errors` объекта `AggregateError`.
264+
228265
## Promise.resolve/reject
229266
230267
Методы `Promise.resolve` и `Promise.reject` редко используются в современном коде, так как синтаксис `async/await` (мы рассмотрим его [чуть позже](info:async-await)) делает их, в общем-то, не нужными.

0 commit comments

Comments
 (0)