Коротка відповідь
juniorPromise — це об’єкт, що представляє асинхронну операцію, яка завершиться успішно або помилкою. Він дозволяє обробляти результат через then/ catch, а також комбінувати кілька асинхронних задач. Promise створюється через new Promise((resolve, reject)=>{…}).
Повне пояснення
Що це і навіщо
Promise — це абстракція над асинхронними операціями, що дозволяє працювати з результатами у вигляді future value. Замість колбеків Promise дає послідовний, ланцюговий підхід.
Ключові принципи
- Статуси: pending, fulfilled (resolve) і rejected (reject).
- Методи:
then(onFulfilled, onRejected),catch(onRejected),finally(onFinally). - Композиція:
Promise.all,Promise.race,Promise.allSettled.
Як це працює
- Конструктор приймає executor‑функцію
(resolve, reject) => { … }. - Внутрішній event loop виконує executor синхронно.
- Після виконання
resolve(value)абоreject(error)Promise переходить у відповідний стан. - Підписані callback‑и виконуються асинхронно через microtask queue.
Практика і реалізація
// JavaScript
const fetchData = () => new Promise((resolve, reject) => {
setTimeout(() => resolve('data'), 1000);
});
fetchData().then(console.log).catch(console.error);
// TypeScript – типізація результату
const fetchNumber = (): Promise<number> => new Promise((res) => res(42));
Тестування (Jest)
test('Promise resolves', async () => {
const result = await fetchData();
expect(result).toBe('data');
});
Оптимізація та edge‑cases
- Не забувайте про unhandled rejection – використовуйте
catchабо глобальний обробник. - Для паралельних запитів застосовуйте
Promise.allі обробляйте окремі помилки через.catchу кожному промісі. - У випадку
Promise.race, перший завершений проміс визначає результат, інші «зникають».
Часті помилки
- Відсутність
returnу ланцюжкуthen→ пропущений результат. - Внутрішня помилка в executor без
reject→ Promise залишається pending. - Перевантаження стеку через рекурсивні
thenбез асинхронного відкладення. - Необроблені
Promise.allSettled→ помилки не виділяються. - Використання
awaitу синхронній функції без async → синтаксична помилка. - Заміна
new Promiseнаasync functionбез потреби → зайва обгортка. - Перевантаження
setTimeoutу промісі → блокування event loop. - Неочікуваний
thisу колбеку – використовуйте arrow functions.
Cheatsheet
new Promise((res, rej) => { … }).then(onFulfilled).catch(onRejected)Promise.all([p1, p2])await promise– синхронізує асинхронний код.
Follow‑up питання
- Як обробляти помилки у
Promise.all? - Чому
async/awaitє синтаксичним шкіркою над Promise? - Які переваги
Promise.allSettledпередPromise.all?