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
+43-5Lines changed: 43 additions & 5 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)) делает их, в общем-то, не нужными.
@@ -286,8 +323,9 @@ let promise = new Promise((resolve, reject) => reject(error));
286
323
2. `Promise.allSettled(promises)` (добавлен недавно) -- ждёт, пока все промисы завершатся и возвращает их результаты в виде массива с объектами, у каждого объекта два свойства:
287
324
- `state`: `"fulfilled"`, если выполнен успешно или `"rejected"`, если ошибка,
288
325
- `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`.
292
330
293
331
Из всех перечисленных методов, самый часто используемый - это, пожалуй, `Promise.all`.
0 commit comments