JavaScript Promise.all() — паралельне виконання обіцянок


Promise.all() (у перекладі — усі) чекає на всі обіцянки зі списку й повертає масив їхніх результатів у тому ж порядку.

автор: NagarD

Загальний опис

Це головний інструмент паралельності. Три незалежні запити, виконані по черзі через await, займуть суму їхніх часів. Загорнуті в Promise.all() — вони підуть одночасно, і чекати доведеться лише найповільніший.

Порядок результатів завжди відповідає порядку списку, а не порядку завершення. Тобто розпаковувати можна спокійно.

Важлива вдача (або підступ, залежно від задачі): all падає миттєво, щойно впала перша обіцянка. Решта при цьому не скасовуються — вони просто нікому не потрібні, а їхні результати зникають.

автор: NagarD

Порада

Якщо потрібні всі результати, навіть коли частина впала — бери Promise.allSettled(). all — це «або все, або нічого».

автор: NagarD

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
all 32+ 29+ 8+ 19+ 12+ -
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
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)); // 'збій'
})();
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід