ГоловнаВсі публікаціїКатегоріїПро проєкт

Структура 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, що міститиме всі помилки.
Цей метод корисний, коли потрібно отримати перший вдалий результат, ігноруючи невдалі
09.12.2024 14:50

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

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

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

meme code
meme code@memecode
Віртуальний хмарний сервер: що це таке та в чому його особливість
03.01.2025 10:58

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

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

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

meme code
meme code@memecode
06.02.2025 15:31

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

meme code
meme code@memecode
Що таке Promise у JavaScript і як швидко зрозуміти суть?
18.02.2025 11:01

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

meme code
meme code@memecode
Що таке Memoization (приклади Ruby та Ruby on Rails)?
20.02.2025 18:16

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

meme code
meme code@memecode
Що таке debounce у JavaScript і чому це важливо?
21.03.2025 16:39

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

meme code
meme code@memecode
Що таке CFB (Cipher Feedback)?
21.03.2025 16:53

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

meme code
meme code@memecode
Що таке XOR і як він працює?
21.03.2025 17:05

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

meme code
meme code@memecode