Skip to content

Commit 073fd2c

Browse files
authored
Merge pull request #1720 from Alexandre887/master
Добавлено описание метода `Promise.any` в статью "Promise API"
2 parents e23b23a + 82e68c8 commit 073fd2c

File tree

1 file changed

+43
-5
lines changed

1 file changed

+43
-5
lines changed

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

Lines changed: 43 additions & 5 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)) делает их, в общем-то, не нужными.
@@ -286,8 +323,9 @@ let promise = new Promise((resolve, reject) => reject(error));
286323
2. `Promise.allSettled(promises)` (добавлен недавно) -- ждёт, пока все промисы завершатся и возвращает их результаты в виде массива с объектами, у каждого объекта два свойства:
287324
- `state`: `"fulfilled"`, если выполнен успешно или `"rejected"`, если ошибка,
288325
- `value` - результат, если успешно или `reason` - ошибка, если нет.
289-
3. `Promise.race(promises)` -- ожидает первый выполненный промис, который становится его результатом, остальные игнорируются.
290-
4. `Promise.resolve(value)` -- возвращает успешно выполнившийся промис с результатом `value`.
291-
5. `Promise.reject(error)` -- возвращает промис с ошибкой `error`.
326+
3. `Promise.race(promises)` -- ожидает первый *выполненный* промис, который становится его результатом, остальные игнорируются.
327+
4. `Promise.any(promises)` (добавлен недавно) -- ожидает первый *успешно выполненный* промис, который становится его результатом, остальные игнорируются. Если все переданные промисы отклонены, [`AggregateError`](mdn:js/AggregateError) становится ошибкой `Promise.any`.
328+
5. `Promise.resolve(value)` -- возвращает успешно выполнившийся промис с результатом `value`.
329+
6. `Promise.reject(error)` -- возвращает промис с ошибкой `error`.
292330
293331
Из всех перечисленных методов, самый часто используемый - это, пожалуй, `Promise.all`.

0 commit comments

Comments
 (0)