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