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

Что такое promise и какие состояния у него есть

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

Состояния promise

У promise есть три состояния:

  • Pending (ожидание) — начальное состояние: асинхронная операция ещё не завершена.
  • Fulfilled (исполнено) — операция завершена успешно, и promise возвращает результат.
  • Rejected (отклонено) — операция завершилась ошибкой, и promise возвращает причину отказа.

Переход между состояниями происходит один раз: из pending в fulfilled (при вызове resolve) или в rejected (при вызове reject). После перехода состояние не меняется.

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

Promise создаётся с помощью конструктора new Promise(executor), где executor — функция с двумя параметрами: resolve и reject. Внутри executor выполняется асинхронная операция; по её завершении вызывается resolve с результатом или reject с ошибкой.

Метод then позволяет зарегистрировать обработчики: первый аргумент — для успешного выполнения, второй — для ошибки. Метод catch — сокращение для обработки только ошибок. Метод finally выполняется в любом случае.

Promise поддерживает цепочки вызовов: каждый then возвращает новый promise, что позволяет организовывать последовательные асинхронные операции читабельно.

Пример

javascript
const обещание = new Promise(function(resolve, reject) {
    // Эмуляция асинхронной операции, например, запроса к серверу
    setTimeout(() => {
        const успех = true; // условие успеха
        if (успех) {
            resolve("данные получены");
        } else {
            reject("ошибка при получении данных");
        }
    }, 1000);
});

обещание
    .then(function(результат) {
        console.log(результат); // обработчик успеха
    })
    .catch(function(ошибка) {
        console.log(ошибка); // обработчик ошибки
    });

Вспомогательные методы

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

Эти методы упрощают работу с группами асинхронных операций.

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

  • Забыть вызвать resolve или reject — promise останется в состоянии pending навсегда, что приведёт к утечке памяти и зависшим обработчикам.
  • Обработка ошибок: если в цепочке then не указать второй аргумент и не добавить catch, ошибка будет проигнорирована (в строгом режиме — приведёт к необработанному отклонению).
  • Исключения внутри executor автоматически превращаются в reject, но только если они синхронные; в асинхронных колбэках (например, в setTimeout) исключения не перехватываются.
  • Путаница между Promise.all и Promise.race: all ждёт все, race — только первый.

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

Promise — основной инструмент для работы с асинхронностью в современном JavaScript. Используйте его вместо callback-функций для улучшения читаемости и поддержки кода. Для сложных сценариев (например, параллельные запросы) применяйте Promise.all или Promise.race. В современном коде также часто используют async/await, который построен на promise и делает асинхронный код ещё более линейным.

Коротко

  • Promise — объект для работы с асинхронными операциями, имеет три состояния: pending, fulfilled, rejected.
  • Переход из pending в fulfilled или rejected происходит один раз через resolve или reject.
  • Методы then, catch, finally позволяют обрабатывать результат и ошибки; цепочки then делают код последовательным.
  • Вспомогательные методы Promise.all, Promise.race, Promise.resolve, Promise.reject упрощают групповую работу с promise.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы