Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Коли проміс вважається "виконаним"?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Проміс вважається "виконаним" (fulfilled)**, коли асинхронна операція успішно завершилася і викликана функція `resolve()` - тобто у проміса з'явився результат (значення). **Ключове:** після переходу в `fulfilled` або `rejected` стан проміса стає остаточним (незмінним).Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Коротка відповідь **Проміс вважається "виконаним" (fulfilled)**, коли асинхронна операція **успішно завершилася** і викликана функція `resolve()` - тобто у проміса з'явився **результат (значення)**. --- ## Формально в ECMAScript У об'єкта `Promise` є **три стани**: | Стан | Що означає | Чи можна змінити | |---|---|---| | `pending` | "очікування" - результат ще невідомий | Так | | `fulfilled` | "виконано успішно" - викликано `resolve()` | Ні | | `rejected` | "виконано з помилкою" - викликано `reject()` | Ні | Після переходу в `fulfilled` або `rejected` - стан стає **остаточним** (незмінним). --- ## Приклад: проміс стає "виконаним" ```javascript const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve('Дані отримано'); }, 1000); }); promise.then((result) => { console.log(result); }); ``` Через 1 секунду викликається `resolve('Дані отримано')` -> проміс переходить з `pending` -> у `fulfilled`, і виконується `.then()`. --- ## Коли він **не** вважається виконаним ### 1. Поки не викликано `resolve()` або `reject()` ```javascript new Promise(() => { // нічого не викликаємо }); // стан: pending (назавжди) ``` ### 2. Якщо проміс повернув інший проміс (ланцюжок) ```javascript const p = new Promise((resolve) => { resolve(fetch('/data')); // resolve повертає інший Promise }); ``` Тоді `p` **не завершиться**, доки **вкладений Promise** не завершиться. (механізм "promise unwrapping" - розгортання промісів). --- ## Приклад з `reject` (помилка) ```javascript const promise = new Promise((resolve, reject) => { reject('Помилка мережі'); }); promise .then(() => console.log('Успіх')) .catch((err) => console.error(err)); ``` Проміс **виконаний**, але у стані `rejected`, тому викликається `.catch()`. --- ## Коли викликається `.then()` / `.catch()` - `.then()` спрацьовує **тільки**, якщо проміс став **fulfilled** - `.catch()` - якщо став **rejected** - `.finally()` - у **будь-якому** випадку після завершення проміса --- ## Приклад з таймінгом ```javascript const p = new Promise((resolve) => { console.log('1 pending'); setTimeout(() => resolve('2 fulfilled'), 2000); }); p.then(console.log); console.log('3 продовжуємо виконання'); ``` Послідовність: ```javascript 1 pending 3 продовжуємо виконання 2 fulfilled ``` Проміс "виконаний" тільки через 2 секунди - у момент виклику `resolve()`. --- ## Підсумок: що означає "Promise виконаний" | Стан | Що сталося | Методи, які спрацюють | |---|---|---| | `pending` | операція в процесі | жодні | | `fulfilled` | викликано `resolve()` | `.then()`, `.finally()` | | `rejected` | викликано `reject()` або помилка | `.catch()`, `.finally()` | --- ## Проста аналогія > Проміс - це як доставка > > - Поки замовлення не доставлене -> `pending` > - Прийшов кур'єр з посилкою -> `fulfilled` > - Кур'єр подзвонив: "адресу не знайдено" -> `rejected` --- ## Підсумок **Promise вважається "виконаним"**, коли він переходить зі стану `pending` -> в один із фінальних: - `fulfilled` - успішно (`resolve(value)`) - `rejected` - з помилкою (`reject(reason)`) Після цього: - стан більше **не змінюється**, - і результат можна отримати через `.then()`, `.catch()` або `await`.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.