JavaScript Promise — обіцянка, асинхронний результат


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

автор: NagarD

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

Уяви, що замовляєш каву. Ти не стоїш біля стійки, заціпенівши: тобі дають талончик. Каву ще не зварено, але в тебе на руках обіцянка, що її або принесуть, або скажуть, що зерна закінчились.

Саме це й є Promise. Він завжди в одному з трьох станів:

  • pending — очікує, результату ще немає;
  • fulfilled — виконано, є значення;
  • rejected — відхилено, є помилка.

Перехід відбувається один раз і назавжди: обіцянка, що вже виконалась, не може передумати.

Це те, що замінило пекло колбеків. Замість вкладених один в одного обробників — плаский ланцюжок .then(), а помилка з будь-якої ланки долітає до одного .catch() у кінці.

У сучасному коді проміси майже завжди споживають через async/await — це той самий проміс, лише записаний як послідовний код.

автор: NagarD

Порада

Незалежні запити не чекай по черзі. Promise.all([a, b, c]) запустить їх одночасно й дочекається всіх — час виконання дорівнюватиме найповільнішому, а не сумі.

автор: NagarD
Нотатка

Функція всередині new Promise() виконується негайно, а не тоді, коли ти викличеш .then(). Проміс не «запускає» операцію — він лише повідомляє про її кінець.

автор: NagarD

Синтаксис

const promise = new Promise((resolve, reject) => { ... });

методи

Метод Опис
then Додає обробники успішного виконання і/або відхилення проміса.
catch Додає обробник відхилення проміса.
finally Додає обробник, який виконується незалежно від результату.
all Чекає на виконання ВСІХ промісів; відхиляється з першим відхиленим.
allSettled Чекає на завершення всіх промісів і віддає масив їхніх результатів.
any Виконується з першим успішним промісом зі списку.
race Виконується чи відхиляється з ПЕРШИМ завершеним промісом.
resolve Створює вже виконаний проміс із заданим значенням.
reject Створює вже відхилений проміс із заданою причиною.

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
Promise 32+ 29+ 8+ 19+ 12+ -
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
Promise 32+ yes yes 8+

Приклади

+ запропонувати свій приклад у пісочниці

Створення обіцянки, ланцюжок і паралельний запуск.

(async () => {
    // власна обіцянка: затримка
    const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

    wait(1000).then(() => console.log('Минула секунда'));

    // ланцюжок: помилка з будь-якої ланки долетить до catch
    fetch('/api/user')
        .then(response => response.json())
        .then(user => console.log(user.name))
        .catch(error => console.error('Не вдалося:', error.message))
        .finally(() => console.log('Запит завершено'));

    // паралельно, а не по черзі
    try {
        const [user, posts] = await Promise.all([
            fetch('/api/user').then(r => r.json()),
            fetch('/api/posts').then(r => r.json()),
        ]);
        console.log(user, posts);
    } catch (error) {
        console.error('Один із запитів упав:', error.message);
    }
})();
автор: NagarD

Коментарі

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

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

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

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

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

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

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

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

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

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

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