> Что такое Promise в JavaScript и как он работает? (JavaScript)
Уровень: junior · Роль: frontend · Категория: Технические вопросы
Компании: Cyber Interactive, Альфа-банк, Инрэко, ООО Премиум ИТ Солюшен, VK, Kodix, Aston, Домклик, IT-One, EPAM, GoInvest, Exness, EdenAI, Evercode, Яндекс
Стек: JavaScript
> Пример ответа
Короткий ответ
Promise - это объект, представляющий результат асинхронной операции, которая может завершиться успешно (resolve) или с ошибкой (reject). Он работает в одном из трёх состояний: pending (ожидание), fulfilled (выполнено успешно) или rejected (отклонено). Promise позволяет обрабатывать асинхронный код через методы .then(), .catch() и .finally(), избегая callback hell.
Подробное объяснение
Promise - это контейнер для будущего значения, которое может быть недоступно в момент создания. Когда асинхронная операция запускается, Promise находится в состоянии pending. После завершения операции он переходит в fulfilled (с результатом) или rejected (с ошибкой). Это состояние фиксируется - Promise нельзя изменить после перехода.
Основные методы:
.then(onFulfilled, onRejected)- вызывается при успехе или ошибке.catch(onRejected)- только для ошибок.finally(onFinally)- выполняется в любом случае
Promise решает проблему callback hell через цепочки .then(), где каждый следующий callback получает результат предыдущего. Также Promise поддерживает статические методы: Promise.all(), Promise.race(), Promise.allSettled() и Promise.any() для работы с несколькими асинхронными операциями.
На практике
Promise используется для:
- HTTP-запросов (fetch возвращает Promise)
- Работы с файлами (FileReader)
- Таймеров и анимаций
- Любых асинхронных операций, где нужно дождаться результата
Важно: Promise не делает код асинхронным сам по себе - он лишь управляет асинхронными операциями. Код внутри конструктора Promise выполняется синхронно, а асинхронность возникает только при вызове resolve/reject внутри setTimeout, fetch и т.д.
Пример кода
JAVASCRIPT// Создание Promiseconst fetchData = new Promise((resolve, reject) => {setTimeout(() => {const data = { id: 1, name: 'John' };// Имитация успешного запросаresolve(data);// Имитация ошибки: reject(new Error('Network error'));}, 1000);});// ИспользованиеfetchData.then(data => {console.log('Получены данные:', data);return data.name;}).then(name => {console.log('Имя:', name);}).catch(error => {console.error('Ошибка:', error.message);}).finally(() => {console.log('Завершено');});// Пример с fetchfetch('https://api.example.com/users').then(response => response.json()).then(users => console.log(users)).catch(err => console.error('Ошибка запроса:', err));
Как отвечать на собеседовании
Начни с определения Promise как объекта для асинхронных операций. Объясни три состояния и методы .then()/.catch()/.finally(). Приведи пример с fetch или setTimeout. Упомяни, что Promise решает проблему callback hell и позволяет писать более читаемый асинхронный код. Если спросят про отличия от async/await, скажи, что async/await - это синтаксический сахар над Promise.
Что проверяет интервьюер
- Понимание асинхронности в JavaScript
- Знание состояний Promise и их переходов
- Умение работать с цепочками Promise
- Понимание разницы между Promise и callback
- Знание статических методов Promise
Типичные ошибки
- Забывают обрабатывать ошибки через
.catch() - Пытаются использовать Promise для синхронных операций
- Не понимают, что
.then()возвращает новый Promise - Путают
Promise.all()иPromise.race() - Создают вложенные Promise вместо цепочек
.then() - Не возвращают Promise из
.then(), когда хотят передать результат дальше
> Похожие задачи по frontend
Как работает прототипное наследование в JavaScript?
Использовали ли кастомные парсеры для преобразования JSON в объекты на уровне бизнес-логики
Что такое поверхностное и глубокое копирование объектов в JavaScript
Был ли опыт работы с нативным JavaScript и event listeners?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью