> Какие состояния бывают у промисов и какие методы у них есть в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Cyber Interactive, Garage Eight, ЛитРес, Aston, GoInvest, Сбер
Стек: JavaScript
> Пример ответа
Короткий ответ
У промисов три состояния: pending (ожидание), fulfilled (выполнен успешно) и rejected (выполнен с ошибкой). Основные методы: then (обработка успеха и ошибки), catch (только ошибки), finally (выполняется в любом случае). Статические методы: Promise.all, Promise.allSettled, Promise.race, Promise.any, Promise.resolve, Promise.reject.
Подробное объяснение
Промис - это объект, представляющий асинхронную операцию. Он может находиться в одном из трёх состояний:
- pending - начальное состояние, операция ещё не завершена
- fulfilled - операция завершена успешно, промис содержит значение
- rejected - операция завершена с ошибкой, промис содержит причину ошибки
Переход возможен только из pending в fulfilled или rejected, после чего состояние фиксируется (immutable).
Методы экземпляра:
then(onFulfilled, onRejected)- возвращает новый промис, позволяет цепочку вызововcatch(onRejected)- сокращение дляthen(null, onRejected), обрабатывает ошибкиfinally(onFinally)- выполняется независимо от результата, не меняет значение промиса
Статические методы:
Promise.all(iterable)- ждёт все промисы, rejects при первом rejectionPromise.allSettled(iterable)- ждёт все, возвращает массив результатов с статусамиPromise.race(iterable)- возвращает первый завершённый промис (любой статус)Promise.any(iterable)- возвращает первый fulfilled, rejects только если все rejectedPromise.resolve(value)- создаёт fulfilled промисPromise.reject(reason)- создаёт rejected промис
На практике
Для senior-разработчика важно понимать trade-off между методами. Promise.all удобен, но опасен - одна ошибка убивает все запросы. В реальных проектах часто используют Promise.allSettled для независимых операций или Promise.any для fallback-стратегий.
Цепочки then позволяют избежать callback hell, но требуют внимания к возвращаемым значениям - каждый then создаёт новый промис. Ошибки в finally не влияют на результат, но могут быть проглочены, если не обработаны.
Пример кода
JAVASCRIPT// Цепочка промисов с обработкой ошибокfetch('/api/user').then(response => {if (!response.ok) throw new Error('Network error');return response.json();}).then(data => processUserData(data)).catch(error => console.error('Failed:', error)).finally(() => hideLoadingSpinner());// Promise.allSettled для независимых запросовconst requests = [fetch('/api/a'), fetch('/api/b'), fetch('/api/c')];Promise.allSettled(requests).then(results => {const successes = results.filter(r => r.status === 'fulfilled').map(r => r.value);const failures = results.filter(r => r.status === 'rejected').map(r => r.reason);// частичная обработка данных});
Как отвечать на собеседовании
Начни с базовых состояний и методов, затем переходи к практическим нюансам. Покажи понимание, когда какой метод использовать. Упомяни, что промисы - основа для async/await, и как они связаны с event loop. Для senior важно продемонстрировать знание граничных случаев: unhandled rejection, memory leaks в длинных цепочках, поведение с thenable-объектами.
Что проверяет интервьюер
- Понимание жизненного цикла промиса и его immutable-природы
- Знание различий между статическими методами и их use cases
- Умение работать с асинхронными ошибками и цепочками
- Понимание микротасков и event loop (как промисы взаимодействуют с синхронным кодом)
Типичные ошибки
- Путаница между
Promise.allиPromise.allSettled- первая ошибка убивает все - Забывают, что
thenиcatchвозвращают новый промис, а не мутируют текущий - Не обрабатывают ошибки в
finally- он не перехватывает исключения - Используют
Promise.raceдля таймаутов без cleanup ресурсов - Создают лишние обёртки:
new Promise((resolve) => resolve(value))вместоPromise.resolve(value)
> Похожие задачи по frontend
Как работает сборщик мусора в JavaScript
В чем отличие массивов от объектов в JavaScript
Что такое AbortController и метод abort в JavaScript
Как работает Promise.all и как реализовать аналог с обработкой reject в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью