Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Дополняет и уточняет доку Promise.race() #5560

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 42 additions & 5 deletions js/promise-race/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: "`Promise.race()`"
description: "Запускаем несколько промисов и дожидаемся того, который выполнится быстрее."
authors:
- agarkov
contributors:
- vitya-ne
related:
- tools/api
- js/async-in-js
Expand All @@ -19,13 +21,13 @@ tags:

## Кратко

Метод `race()` — это один из статических методов объекта `Promise`. Его используют, чтобы запустить несколько промисов и дождаться того, который выполнится быстрее.
Метод `race()` — это один из статических методов объекта `Promise`. Его используют, чтобы запустить несколько промисов и получить результат того, который выполнится быстрее.

## Как пишется

`Promise.race()` принимает итерируемую коллекцию промисов, чаще всего — [массив](/js/arrays/). Потом метод возвращает новый промис.
`Promise.race()` принимает итерируемую коллекцию промисов, чаще всего — [массив](/js/arrays/).

Метод завершится, когда завершится самый быстрый из всех переданных. Остальные промисы будут проигнорированы.
Метод возвращает новый промис, который завершится, когда будет получен первый результат или ошибка от переданных промисов. Результаты или ошибки остальных промисов будут проигнорированы.

## Как понять

Expand Down Expand Up @@ -99,11 +101,46 @@ Promise.race([])
})
```

### Непромисы в массиве промисов

Создадим массив, где `theFastest` — завершённый промис, а `3` — элемент, не являющийся промисом.

```js
const slow = new Promise(
resolve => setTimeout(() => resolve(1), 6000)
)
const theFastest = Promise.resolve(2)

const promises = [slow, theFastest, 3]
```

Передадим массив из созданных промисов в `Promise.race()`:

```js
Promise.race(promises)
.then((value) => {
console.log(value)
// 2
})
```

В консоль запишется результат выполнения `theFastest`, так как в массиве он был первым завершённым промисом. Если поменять порядок элементов, результат изменится:

```js
const promises = [slow, 3, theFastest]

Promise.race(promises)
.then((value) => {
console.log(value)
// 3
})
```

### Отличие от `Promise.any()`

Как мы уже знаем, `Promise.race()` завершится, когда завершится самый быстрый из всех переданных промисов. Даже если он завершается _с ошибкой_.
Как мы уже знаем, `Promise.race()` вернёт промис, который завершится, когда получен первый (самый быстрый) результат или _ошибка_ из всех переданных промисов.

[`Promise.any()`](/js/promise-any/) завершится, когда _без ошибки_ завершится самый быстрый из всех переданных промисов.
[`Promise.any()`](/js/promise-any/) вернёт промис, который завершится, когда получен первый (самый быстрый) результат (_без ошибки_) из всех переданных промисов.

Создадим ещё раз несколько промисов, где `theFastest` завершается с ошибкой:

Expand Down
Loading