> Что такое промисы в JavaScript и как они работают (JavaScript)

Уровень: junior · Роль: frontend · Категория: Технические вопросы

Компании: Иннотех, Cyber Interactive, Kvando Technologies, Soft_Media_Group, ООО Премиум ИТ Солюшен, ЛитРес, IT-One, Софт Медиа Групп, Библио-Глобус, Сбер, Globaldrive, Purrweb, SmartWay, Яндекс

Стек: JavaScript

> Пример ответа

Короткий ответ

Промис - это объект, представляющий результат асинхронной операции, который будет доступен в будущем. Он находится в одном из трёх состояний: pending (ожидание), fulfilled (выполнен) или rejected (отклонён). Промисы решают проблему callback hell и предоставляют цепочки вызовов через .then(), .catch() и .finally(). Они работают на основе microtask queue, что гарантирует их выполнение после текущего синхронного кода, но до макрозадач.

Подробное объяснение

Промис создаётся с помощью конструктора new Promise(executor), где executor - функция с двумя параметрами: resolve и reject. Вызов resolve(value) переводит промис в состояние fulfilled, а reject(error) - в rejected. После перехода в одно из финальных состояний промис не может изменить его.

Основные методы:

  • .then(onFulfilled, onRejected) - возвращает новый промис, что позволяет строить цепочки.
  • .catch(onRejected) - обрабатывает ошибки, эквивалентен .then(undefined, onRejected).
  • .finally(onFinally) - выполняется в любом случае, не влияет на значение.

Промисы поддерживают статические методы: Promise.all(), Promise.allSettled(), Promise.race(), Promise.any() для работы с несколькими асинхронными операциями.

Важно понимать, что промис - это не отмена операции, а лишь обёртка над результатом. Отмена требует дополнительной логики через AbortController или флаги.

На практике

В реальной разработке промисы используются для работы с fetch, чтения файлов, таймеров и любых асинхронных операций. Современный код часто использует async/await, который является синтаксическим сахаром над промисами. Однако понимание промисов необходимо для отладки, работы с библиотеками и написания собственных асинхронных утилит.

При построении цепочек важно помнить, что каждый .then() возвращает новый промис, поэтому ошибки можно обрабатывать в конце цепочки через один .catch().

Пример кода

JAVASCRIPT
// Базовый пример
const fetchUser = (id) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (id > 0) {
resolve({ id, name: 'Alice' });
} else {
reject(new Error('Invalid id'));
}
}, 1000);
});
};
fetchUser(1)
.then(user => {
console.log(user.name); // Alice
return user.id;
})
.then(id => console.log(`User id: ${id}`))
.catch(error => console.error(error.message))
.finally(() => console.log('Operation completed'));
// Promise.all
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
Promise.all([promise1, promise2])
.then(results => console.log(results)); // [1, 2]

Как отвечать на собеседовании

Начните с определения и трёх состояний. Затем объясните, как создать промис и какие методы доступны. Покажите понимание цепочек и обработки ошибок. Упомяните связь с async/await и microtask queue. Если спросят про отличия от callback - подчеркните читаемость и композицию. Для junior достаточно уверенного объяснения базовых концепций и простого примера.

Что проверяет интервьюер

  • Понимание асинхронности в JavaScript.
  • Знание состояний промиса и переходов между ними.
  • Умение работать с цепочками и обрабатывать ошибки.
  • Понимание разницы между microtask и macrotask.
  • Знание статических методов и их применений.
  • Способность объяснить, как async/await работает под капотом.

Типичные ошибки

  • Забывают, что промис нельзя отменить.
  • Путают порядок выполнения: промисы выполняются до setTimeout, но после синхронного кода.
  • Не возвращают промис из .then(), что ломает цепочку.
  • Обрабатывают ошибки в каждом .then() вместо одного .catch() в конце.
  • Не знают разницу между Promise.all и Promise.allSettled.
  • Пытаются использовать resolve или reject несколько раз - повторные вызовы игнорируются.
  • Не понимают, что new Promise выполняется синхронно, а then - асинхронно.

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

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