Коли проміс вважається "виконаним"?
Коротка відповідь
Проміс вважається "виконаним" (fulfilled),
коли асинхронна операція успішно завершилася
і викликана функція resolve() -
тобто у проміса з'явився результат (значення).
Формально в ECMAScript
У об'єкта Promise є три стани:
| Стан | Що означає | Чи можна змінити |
|---|---|---|
pending | "очікування" - результат ще невідомий | Так |
fulfilled | "виконано успішно" - викликано resolve() | Ні |
rejected | "виконано з помилкою" - викликано reject() | Ні |
Після переходу в fulfilled або rejected -
стан стає остаточним (незмінним).
Приклад: проміс стає "виконаним"
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Дані отримано');
}, 1000);
});
promise.then((result) => {
console.log(result);
});Через 1 секунду викликається resolve('Дані отримано')
-> проміс переходить з pending -> у fulfilled,
і виконується .then().
Коли він не вважається виконаним
1. Поки не викликано resolve() або reject()
new Promise(() => {
// нічого не викликаємо
});
// стан: pending (назавжди)2. Якщо проміс повернув інший проміс (ланцюжок)
const p = new Promise((resolve) => {
resolve(fetch('/data')); // resolve повертає інший Promise
});Тоді p не завершиться, доки вкладений Promise не завершиться.
(механізм "promise unwrapping" - розгортання промісів).
Приклад з reject (помилка)
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()- у будь-якому випадку після завершення проміса
Приклад з таймінгом
const p = new Promise((resolve) => {
console.log('1 pending');
setTimeout(() => resolve('2 fulfilled'), 2000);
});
p.then(console.log);
console.log('3 продовжуємо виконання');Послідовність:
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.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.