Встречается на 36% собеседований по JavaScript

Что такое Promise

Promise — это объект, представляющий результат успешного или неудачного завершения асинхронной операции. Он позволяет писать асинхронный код более читаемо и управляемо, избегая вложенных колбэков (так называемого «ада колбэков»).

Как это работает

Promise находится в одном из трёх состояний:

  • pending — ожидание, операция ещё не завершена;
  • fulfilled — операция завершилась успешно, получен результат;
  • rejected — операция завершилась ошибкой.

Создаётся Promise через конструктор new Promise(executor), где executor — функция с двумя параметрами: resolve и reject. Вызов resolve(value) переводит промис в состояние fulfilled, а reject(error) — в rejected. После перехода в одно из конечных состояний промис не может изменить его.

Методы и статические помощники

Основные методы экземпляра:

  • then(onFulfilled, onRejected) — обрабатывает успешное выполнение и (опционально) ошибку;
  • catch(onRejected) — обрабатывает только ошибку (эквивалент then(undefined, onRejected));
  • finally(onFinally) — выполняется в любом случае, независимо от результата.

Статические методы для работы с несколькими промисами:

  • Promise.all(iterable) — ждёт выполнения всех промисов; если хотя бы один отклонён, возвращает отклонённый промис;
  • Promise.race(iterable) — возвращает первый завершённый промис (успешный или отклонённый);
  • Promise.allSettled(iterable) — ждёт завершения всех, возвращает массив с результатами каждого;
  • Promise.any(iterable) — возвращает первый успешно выполненный промис.

Пример

javascript
const promise = new Promise((resolve, reject) => {
  setTimeout(() => resolve('Успех!'), 1000);
});

promise
  .then(result => console.log(result)) // "Успех!"
  .catch(error => console.error(error));

Цепочки промисов позволяют последовательно выполнять асинхронные операции:

javascript
fetch('/api/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Ошибка:', error));

Подводные камни

  • Промис выполняется сразу при создании — нельзя «отложить» запуск, если только не обернуть его в функцию.
  • Ошибки внутри then перехватываются ближайшим catch, но если catch нет, ошибка останется незамеченной (в Node.js может привести к падению процесса).
  • Promise.all отклоняется при первой же ошибке, даже если остальные промисы ещё выполняются — это может привести к неожиданному поведению.
  • Не забывайте возвращать промис из then, иначе цепочка разорвётся.

Когда использовать

Промисы — стандартный способ работы с асинхронностью в JavaScript. Их используют для:

  • HTTP-запросов (fetch, axios);
  • работы с файлами и базами данных;
  • таймеров и событий;
  • любых операций, результат которых появляется не сразу.

Современный синтаксис async/await построен на промисах и делает код ещё более линейным, но понимание промисов остаётся обязательным для фронтенд-разработчика.

Коротко

  • Promise — объект с состояниями pending, fulfilled, rejected.
  • Основные методы: then, catch, finally; статические: all, race, allSettled, any.
  • Промисы решают проблему «ада колбэков» и являются основой async/await.
  • Ошибки обрабатываются через catch, но не забывайте возвращать промисы в цепочке.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы