Skip to main content

Чим resolve відрізняється від reject?

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

  • resolve(value) - повідомляє, що операція успішно завершилась → проміс стає fulfilled (виконаним).
  • reject(reason) - повідомляє, що операція завершилась з помилкою → проміс стає rejected (відхиленим).

Обидва переводять проміс зі стану pending → у остаточний (settled), але в різні "гілки" результату.

Приклад

javascript
const promise = new Promise((resolve, reject) => { const success = Math.random() > 0.5; if (success) { resolve('Все пройшло успішно'); } else { reject('Сталася помилка'); } }); promise .then(result => console.log('then:', result)) .catch(error => console.log('catch:', error)) .finally(() => console.log('finally'));

Можливий вивід:

javascript
then: Все пройшло успішно finally

або

javascript
catch: Сталася помилка finally

Як вони працюють

МетодЩо робитьСтан промісуЩо викличе
resolve(value)Завершує проміс успішно, передає значення valuefulfilled.then(value => …)
reject(reason)Завершує проміс з помилкою, передає reasonrejected.catch(error => …)

Після виклику одного з них:

  • проміс "фіксується" (settled),
  • повторний виклик resolve або reject буде проігноровано.

Приклад: resolve

javascript
const promise = new Promise((resolve) => { setTimeout(() => { resolve('Дані отримано!'); }, 1000); }); promise.then(result => console.log(result));

Через 1 секунду:

javascript
Дані отримано!

Проміс перейшов у стан fulfilled.

Приклад: reject

javascript
const promise = new Promise((resolve, reject) => { setTimeout(() => { reject('Помилка мережі'); }, 1000); }); promise.catch(error => console.error(error));

Через 1 секунду:

javascript
Помилка мережі

Проміс перейшов у стан rejected.

Важливо: змінити стан можна лише один раз

javascript
const promise = new Promise((resolve, reject) => { resolve('OK'); reject('Помилка'); // проігноровано }); promise.then(console.log).catch(console.error);

Після першого виклику (resolve) проміс став fulfilled, і другий виклик (reject) не має ефекту.

Приклад: resolve з іншим промісом

Якщо в resolve() передати інший Promise, поточний проміс чекатиме його завершення.

javascript
const inner = new Promise((resolve) => setTimeout(() => resolve('Внутрішній результат'), 1000)); const outer = new Promise((resolve) => resolve(inner)); outer.then(console.log); // виведе "Внутрішній результат" через 1 сек.

Це називається promise unwrapping - "розгортання" промісів.

Обробка результатів

javascript
new Promise((resolve, reject) => { resolve('OK'); }).then(console.log); // OK new Promise((resolve, reject) => { reject('Помилка'); }).catch(console.error); // Помилка

Аналогія

Уяви проміс як доставку:

  • resolve → кур'єр привіз посилку (все успішно)
  • reject → кур'єр зателефонував і сказав: "адресу не знайдено" (помилка)

ІТОГ

МетодСтанЩо передаєОбробляється деАналогія
resolve(value)fulfilledУспішний результат.then()Посилка доставлена
reject(reason)rejectedПомилка / причина відмови.catch()Кур'єр не зміг доставити
Після викликуПроміс стає settled, і змінити його вже не можна---

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

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

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