Skip to main content

Коли проміс вважається "виконаним"?

Коротка відповідь

Проміс вважається "виконаним" (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.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.