Что такое 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, что позволяет организовывать последовательные асинхронные операции читабельно.
Пример
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.
