Что такое 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)— возвращает первый успешно выполненный промис.
Пример
const promise = new Promise((resolve, reject) => {
setTimeout(() => resolve('Успех!'), 1000);
});
promise
.then(result => console.log(result)) // "Успех!"
.catch(error => console.error(error));Цепочки промисов позволяют последовательно выполнять асинхронные операции:
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, но не забывайте возвращать промисы в цепочке.
