> Что такое 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
// Создание Promise
const 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('Завершено');
});
// Пример с fetch
fetch('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(), когда хотят передать результат дальше

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью