Зміст дописунатисність на посилання, щоб перейти до потрібного місця
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));
Що відбувається у прикладі:
- p1 відхиляється через 1 секунду.
- p2 виконується успішно через 2 секунди.
- Promise.any() повертає p2, оскільки він був першим успішним.
- Якщо всі проміси відхиляться, повернеться AggregateError, що міститиме всі помилки.
Цей метод корисний, коли потрібно отримати перший вдалий результат, ігноруючи невдалі
Цей допис поки що не має жодних доповнень від автора/ки