JavaScript Promise.allSettled() — дочекатися всіх, навіть невдалих
Promise.allSettled() чекає, доки всі обіцянки завершаться — байдуже, успіхом чи помилкою — і повертає стан кожної.
Загальний опис
На відміну від all, він ніколи не падає. Кожен елемент результату — це об'єкт зі status: або fulfilled зі value, або rejected з reason.
Потрібен там, де невдача частини — нормальна ситуація. Надсилаєш десять сповіщень: три не дійшли, але сім дійшли, і це успіх, а не збій. all тут відкинув би все через одне падіння.
- Порада
-
Правило вибору просте:
автор: NagarDall— коли без усіх результатів далі нема сенсу;allSettled— коли часткова невдача прийнятна.
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| allSettled | 76+ | 71+ | 13+ | 63+ | 79+ | - |
| Переглядач | ||||
|---|---|---|---|---|
| allSettled | 76+ | yes | yes | 13+ |
Приклади
+ запропонувати свій приклад у пісочниці
Частина запитів упала — решта все одно приїхала.
// top-level await працює лише в модулях — тут той самий код в async-функції
(async () => {
const results = await Promise.allSettled([
fetch('/api/one').then(r => r.json()),
fetch('/api/broken').then(r => r.json()),
fetch('/api/three').then(r => r.json()),
]);
for (const result of results) {
if (result.status === 'fulfilled') {
console.log('Готово:', result.value);
} else {
console.warn('Не вийшло:', result.reason.message);
}
}
// лише вдалі
const ok = results
.filter(r => r.status === 'fulfilled')
.map(r => r.value);
})();
Коментарі
Коментарів ще немає — будьте першим!