Обкладинка нотатки: Структура Promise (JavaScript) та як з цим працювати

Структура Promise (JavaScript) та як з цим працювати

Партнерський матеріал
Зміст дописунатисність на посилання, щоб перейти до потрібного місця
Promise — це об’єкт, який представляє результат асинхронної операції. Вони дають змогу працювати з відкладеними результатами без вкладених колбеків, що робить код більш читабельним. Раніше я вже робив маленький допис про те що таке Promise. Але зараз розглянемо структуру і деякі методи.

Як виглядає структура Promise

Promise створюється за допомогою конструктора new Promise(), якому передається функція з двома аргументами: resolve та reject. Ось саме цю структуру і треба запам'ятати. Розглянемо приклад:
const promise = new Promise((resolve, reject) => {
  const success = Math.random() > 0.5;
  
  setTimeout(() => {
    if (success) {
      resolve("Операція виконана успішно");
    } else {
      reject("Сталася помилка");
    }
  }, 1000);
});
Цей код створює проміс, який після секунди (таймаут 1000) або вирішується (resolve) зі строкою "Операція виконана успішно", або відхиляється (reject) з повідомленням про помилку. Тобто ми створили емітацію відповіді success, почекали секунду і отримали результат який залежав від нашого рандомного значення у success.

Робота з Promise

Promise має методи .then(), .catch() та .finally() для обробки результату.
promise
  .then(result => {
    console.log("Успіх:", result);
  })
  .catch(error => {
    console.log("Помилка:", error);
  })
  .finally(() => {
    console.log("Операція завершена");
  });
Тут .then() отримує значення з resolve, .catch() обробляє помилку з reject, а .finally() виконується завжди, незалежно від результату. Ці методи також варто запам'ятати.

Ланцюжки Promise

Метод .then() повертає новий Promise, що дозволяє послідовне (ланцюжкове) виконання.
new Promise(resolve => resolve(10))
  .then(num => num * 2)
  .then(num => num + 5)
  .then(result => console.log("Результат:", result));
Тут початкове значення 10 множиться на 2, додається 5, і в результаті виводиться 25.

Promise.all, Promise.race та Promise.any

Метод Promise.all() чекає на виконання всіх переданих промісів.
Promise.all([
  new Promise(resolve => setTimeout(() => resolve("Перше"), 1000)),
  new Promise(resolve => setTimeout(() => resolve("Друге"), 2000))
]).then(results => console.log("Усі виконані:", results));
А Promise.race() повертає перший виконаний проміс. Цей метод легко запам'ятати за назвою race - хто перший, той і переміг.
Promise.race([
  new Promise(resolve => setTimeout(() => resolve("Перше"), 1000)),
  new Promise(resolve => setTimeout(() => resolve("Друге"), 500))
]).then(result => console.log("Перше виконане:", result));
Promise.any() — це метод, який приймає масив промісів і повертає перший успішно виконаний проміс. Якщо всі проміси відхиляються, він повертає помилку AggregateError.
const p1 = new Promise((_, reject) => setTimeout(() => reject("Помилка 1"), 1000));
const p2 = new Promise(resolve => setTimeout(() => resolve("Успіх 2"), 2000));
const p3 = new Promise(resolve => setTimeout(() => resolve("Успіх 3"), 3000));

Promise.any([p1, p2, p3])
  .then(result => console.log("Перший успішний результат:", result))
  .catch(error => console.log("Усі проміси відхилені:", error));
Що відбувається у прикладі:
  1. p1 відхиляється через 1 секунду.
  2. p2 виконується успішно через 2 секунди.
  3. Promise.any() повертає p2, оскільки він був першим успішним.
  4. Якщо всі проміси відхиляться, повернеться AggregateError, що міститиме всі помилки.
Цей метод корисний, коли потрібно отримати перший вдалий результат, ігноруючи невдалі
Категорії: Програмування
🤖 Категорії підібрані ШІ: Програмне забезпечення

🔗 Цитувати допис: "Структура Promise (JavaScript) та як з цим працювати"

Якщо ви хочете процитувати цей допис у своїй роботі, статті, блозі, використовуйте наведену нижче інформацію.

Розгорнути деталі


🙌 Підтримати блог @memecode

Ви можете поширити цей допис у соцмережах, чим допоможете платформі цейво розвиватись (* ^ ω ^)

📝 Більше публікацій:
Обкладинка нотатки: Що потрібно знати, щоб побудувати успішну кар'єру на фрілансі в IT
Обкладинка нотатки: Віртуальний хмарний сервер: що це таке та в чому його особливість
Обкладинка нотатки: [Fix] Heroku / SearchBox addon - помилка ідексації "The client is unable to verify that the server is Elasticsearch"
Обкладинка нотатки: Що таке Promise у JavaScript і як швидко зрозуміти суть?
Обкладинка нотатки: Що таке Memoization (приклади Ruby та Ruby on Rails)?
Дисклеймер

Інформація на сайті tseivo.com є суб'єктивною та відображає особисті погляди та досвід авторів та авторок блогів.

Використовуйте цей ресурс як одне з декількох джерел інформації під час своїх досліджень та прийняття рішень. Завжди застосовуйте критичне мислення. Людина сама несе відповідальність за свої рішення та дії.