You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/11-async/05-promise-api/article.md
+39-2Lines changed: 39 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Promise API
2
2
3
-
В классе `Promise` есть 5 статических методов. Давайте познакомимся с ними.
3
+
В классе `Promise` есть 6 статических методов. Давайте познакомимся с ними.
4
4
5
5
## Promise.all
6
6
@@ -205,7 +205,7 @@ if(!Promise.allSettled) {
205
205
206
206
## Promise.race
207
207
208
-
Метод очень похож на `Promise.all`, но ждёт только первый выполненный промис, из которого берёт результат (или ошибку).
208
+
Метод очень похож на `Promise.all`, но ждёт только первый *выполненный* промис, из которого берёт результат (или ошибку).
209
209
210
210
Синтаксис:
211
211
@@ -225,6 +225,43 @@ Promise.race([
225
225
226
226
Быстрее всех выполнился первый промис, он и дал результат. После этого остальные промисы игнорируются.
227
227
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))
console.log(error.errors[1]); // Error: Ещё одна ошибка!
260
+
});
261
+
```
262
+
263
+
Как вы можете видеть, объекты ошибок для отклонённых промисов доступны в свойстве `errors` объекта `AggregateError`.
264
+
228
265
## Promise.resolve/reject
229
266
230
267
Методы `Promise.resolve` и `Promise.reject` редко используются в современном коде, так как синтаксис `async/await` (мы рассмотрим его [чуть позже](info:async-await)) делает их, в общем-то, не нужными.
0 commit comments