JavaScript Promise.all() — паралельне виконання обіцянок
Promise.all() (у перекладі — усі) чекає на всі обіцянки зі списку й повертає масив їхніх результатів у тому ж порядку.
Загальний опис
Це головний інструмент паралельності. Три незалежні запити, виконані по черзі через await, займуть суму їхніх часів. Загорнуті в Promise.all() — вони підуть одночасно, і чекати доведеться лише найповільніший.
Порядок результатів завжди відповідає порядку списку, а не порядку завершення. Тобто розпаковувати можна спокійно.
Важлива вдача (або підступ, залежно від задачі): all падає миттєво, щойно впала перша обіцянка. Решта при цьому не скасовуються — вони просто нікому не потрібні, а їхні результати зникають.
- Порада
-
Якщо потрібні всі результати, навіть коли частина впала — бери
автор: NagarDPromise.allSettled().all— це «або все, або нічого».
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| all | 32+ | 29+ | 8+ | 19+ | 12+ | - |
| Переглядач | ||||
|---|---|---|---|---|
| all | 32+ | yes | yes | 8+ |
Приклади
+ запропонувати свій приклад у пісочниці
Три запити одночасно замість трьох по черзі.
(async () => {
try {
// повільно: запити йдуть по черзі
const user = await fetch('/api/user').then(r => r.json());
const posts = await fetch('/api/posts').then(r => r.json());
// швидко: всі одночасно, чекаємо найповільніший
const [user2, posts2, tags] = await Promise.all([
fetch('/api/user').then(r => r.json()),
fetch('/api/posts').then(r => r.json()),
fetch('/api/tags').then(r => r.json()),
]);
console.log(user2, posts2, tags);
} catch (error) {
console.log('Запити не пройшли:', error.message);
}
// одна впала — впав увесь all
Promise.all([Promise.resolve(1), Promise.reject(new Error('збій'))])
.catch(error => console.error(error.message)); // 'збій'
})();
Коментарі
Коментарів ще немає — будьте першим!