Структура 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 і як швидко зрозуміти суть?
18 лют. '25, 11:01

Що таке Promise у JavaScript і як швидко зрозуміти суть?

meme code
Що таке Memoization (приклади Ruby та Ruby on Rails)?
20 лют. '25, 18:16

Що таке Memoization (приклади Ruby та Ruby on Rails)?

meme code
6 лют. '25, 15:31

Фікс помилки [DEPRECATION] #adapters is deprecated. Use #profiles instead. (Codecov / docile)

meme code
[Fix] Heroku / SearchBox addon - помилка ідексації "The client is unable to verify that the server is Elasticsearch"
31 січ. '25, 13:09

[Fix] Heroku / SearchBox addon - помилка ідексації "The client is unable to verify that the server is Elasticsearch"

meme code
Що таке debounce у JavaScript і чому це важливо?
21 бер. '25, 16:39

Що таке debounce у JavaScript і чому це важливо?

meme code
Що таке CFB (Cipher Feedback)?
21 бер. '25, 16:53

Що таке CFB (Cipher Feedback)?

meme code
Що таке XOR і як він працює?
21 бер. '25, 17:05

Що таке XOR і як він працює?

meme code
Embed програмування: що це таке і з чого почати
24 бер. '25, 16:48

Embed програмування: що це таке і з чого почати

meme code
Pessimistic Lock у Rails: що це таке і коли застосовувати. Які є альтернативи?
31 бер. '25, 17:45

Pessimistic Lock у Rails: що це таке і коли застосовувати. Які є альтернативи?

meme code
Віртуальний хмарний сервер: що це таке та в чому його особливість
3 січ. '25, 10:58

Віртуальний хмарний сервер: що це таке та в чому його особливість

meme code
Що потрібно знати, щоб побудувати успішну кар'єру на фрілансі в IT
23 груд. '24, 16:03

Що потрібно знати, щоб побудувати успішну кар'єру на фрілансі в IT

meme code
9 груд. '24, 14:50

[Фікс] No such file or directory @ rb_sysopen - tmp/pids/server.pid

meme code