> Что такое промисы в 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); // Alicereturn user.id;}).then(id => console.log(`User id: ${id}`)).catch(error => console.error(error.message)).finally(() => console.log('Operation completed'));// Promise.allconst 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- асинхронно.
> Похожие задачи по frontend
Сколько типов данных в JavaScript и какие они
Что такое всплытие (hoisting) в JavaScript?
В чем разница между var, const и let в JavaScript
Что такое каррирование
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью