Що робить Promise.any()?
Що робить Promise.any()
Promise.any(iterable) приймає масив (або будь-який ітерований об'єкт) промісів
і повертає новий проміс, який:
- виконується (
fulfilled), щойно перший проміс успішно завершиться (resolve); - відхиляється (
rejected), якщо всі проміси відхилені.
Тобто: "дай мені перший успішний результат - помилки ігноруй".
Синтаксис
Promise.any(iterable)Повертає:
новий Promise, який:
- завершиться зі значенням першого
fulfilledпромісу; - відхилиться зі спеціальною помилкою
AggregateError, якщо всі проміси впали.
Приклад 1 - перший успішний "перемагає"
const p1 = Promise.reject('Помилка 1');
const p2 = new Promise(resolve => setTimeout(() => resolve('Успіх 2'), 1000));
const p3 = new Promise(resolve => setTimeout(() => resolve('Успіх 3'), 2000));
Promise.any([p1, p2, p3])
.then(result => console.log('Результат:', result))
.catch(err => console.error('Помилка:', err));Вивід через 1 секунду:
Результат: Успіх 2Перший успішний (p2) "перемагає",
навіть якщо решта все ще виконуються або впадуть пізніше.
Приклад 2 - якщо всі проміси відхиляються
const p1 = Promise.reject('Помилка A');
const p2 = Promise.reject('Помилка B');
Promise.any([p1, p2])
.then(console.log)
.catch(err => console.error(err));Вивід:
AggregateError: All promises were rejectedПомилка містить список усіх причин:
err.errors // ['Помилка A', 'Помилка B']Як це працює під капотом
- Усі проміси запускаються паралельно.
- Якщо хоча б один із них виконався успішно (
resolve) →Promise.any()негайно завершується з цим результатом. - Якщо всі виявилися
rejected→ повертається помилка типуAggregateErrorз масивом усіх причин.
Приклад 3 - комбінація успіхів і помилок
const slow = new Promise(resolve => setTimeout(() => resolve('Повільний успіх'), 2000));
const fail = Promise.reject('Помилка!');
const fast = new Promise(resolve => setTimeout(() => resolve('Швидкий успіх'), 500));
Promise.any([slow, fail, fast])
.then(console.log)
.catch(console.error);Результат через 0.5 сек:
Швидкий успіхНавіть якщо fail впав раніше, Promise.any() чекає перший успішний проміс.
Відмінність від інших методів
| Метод | Що повертає | Завершується коли | Помилка при |
|---|---|---|---|
Promise.all() | Масив результатів усіх успішних | Усі проміси fulfilled | Перший reject |
Promise.allSettled() | Масив статусів (fulfilled / rejected) | Усі проміси завершені | Ніколи |
Promise.race() | Перший завершений проміс (успіх чи помилка) | Будь-який resolve або reject | Завершується при першому reject |
Promise.any() | Перший успішний результат | Перший fulfilled | Коли всі rejected |
Тобто:
Promise.race()реагує на перший завершений проміс (включно з помилками),Promise.any()реагує тільки на перший успішний.
Приклад 4 - "резервне копіювання" (fallback)
Уяви, що в тебе три сервери: ти хочеш отримати дані з першого, який відповість успішно, навіть якщо два інших недоступні.
const fetchFromA = fetch('/api/a'); // може впасти
const fetchFromB = fetch('/api/b');
const fetchFromC = fetch('/api/c');
Promise.any([fetchFromA, fetchFromB, fetchFromC])
.then(res => console.log('Відповідь отримано'))
.catch(() => console.error('Усі сервери недоступні'));Таким чином ти реалізуєш стратегію "fallback" - успіху будь-якого джерела достатньо.
Приклад 5 - поведінка AggregateError
Promise.any([
Promise.reject('Помилка 1'),
Promise.reject('Помилка 2')
]).catch(err => {
console.error(err.name); // AggregateError
console.error(err.errors); // ['Помилка 1', 'Помилка 2']
});Проста аналогія
Уяви, що ти відправляєш трьох кур'єрів на велосипеді, авто та ракеті.
Promise.any()каже: "хто першим успішно доставить, того результат я прийму; помилки решти - неважливі".- Тільки якщо всі загубляться - тоді ти дізнаєшся про помилку.
ПІДСУМОК
| Властивість | Значення |
|---|---|
| Що робить | Повертає перший успішно виконаний проміс |
| Якщо всі відхилені | Повертає AggregateError з причинами |
| Тип значення, що повертається | Promise |
| Схожий на | Promise.race(), але ігнорує reject |
| Типові сценарії | fallback-запити, резервні джерела даних, надлишкові API-запити |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.