> Как использовать resolve и reject внутри callback для управления состоянием Promise в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Яндекс
Стек: JavaScript
> Пример ответа
Короткий ответ
resolve и reject - это функции, передаваемые в executor-функцию конструктора Promise. Вызов resolve(value) переводит promise в состояние fulfilled с результатом value, а reject(reason) - в rejected с причиной ошибки. Внутри callback их можно вызывать асинхронно, условно или в обработчиках событий, управляя моментом и результатом завершения промиса.
Подробное объяснение
Конструктор Promise принимает executor-функцию с двумя параметрами: resolve и reject. Эти параметры - колбэки, предоставляемые рантаймом JavaScript. Вызов resolve немедленно фиксирует состояние промиса как fulfilled и делает доступным результат через .then(). Вызов reject фиксирует состояние rejected, передавая управление в .catch().
Важно: после первого вызова resolve или reject любые последующие вызовы игнорируются - promise может быть resolved только один раз. Это защищает от случайного двойного завершения.
Внутри callback resolve и reject можно использовать:
- в условных конструкциях (if/else, switch)
- в колбэках асинхронных операций (setTimeout, fetch, addEventListener)
- в циклах или рекурсивных вызовах
- в обработчиках ошибок (try/catch)
resolve может принимать любой тип, включая другой promise - в этом случае внешний promise "привязывается" к состоянию внутреннего. reject обычно принимает объект Error, но технически может быть любым значением.
На практике
Типичный сценарий - обёртка callback-based API в promise. Например, fs.readFile в Node.js или XMLHttpRequest в браузере. Внутри callback вызывается resolve при успехе и reject при ошибке.
При работе с асинхронными итерациями или событиями resolve может вызываться не сразу, а после выполнения условия или накопления данных. Это позволяет создавать кастомные промисы с гибкой логикой завершения.
Важно помнить: если callback никогда не вызовет ни resolve, ни reject, promise останется в состоянии pending навсегда, что приведёт к утечке памяти и необработанным ожиданиям.
Пример кода
JAVASCRIPTfunction readFilePromise(path) {return new Promise((resolve, reject) => {fs.readFile(path, 'utf8', (err, data) => {if (err) {reject(err); // ошибка - rejected} else {resolve(data); // успех - fulfilled}});});}// Условный resolve/rejectfunction waitForCondition(conditionFn) {return new Promise((resolve, reject) => {const check = () => {try {const result = conditionFn();if (result) {resolve(result);} else {setTimeout(check, 100);}} catch (error) {reject(error);}};check();});}// resolve с другим promisefunction chainPromises() {return new Promise((resolve) => {resolve(Promise.resolve(42)); // внешний promise примет состояние внутреннего});}
Как отвечать на собеседовании
Начни с определения: resolve и reject - это колбэки для управления состоянием промиса. Объясни, что они вызываются ровно один раз, и продемонстрируй понимание асинхронного контекста. Приведи пример обёртки callback API. Упомяни, что resolve может принимать другой promise, а reject - только причину ошибки. Не углубляйся в микротаски, если не спросят. Говори чётко, без воды.
Что проверяет интервьюер
- Понимание жизненного цикла промиса (pending → fulfilled/rejected)
- Знание, что resolve/reject вызываются только один раз
- Умение работать с асинхронными колбэками и оборачивать legacy API
- Понимание разницы между resolve(reason) и reject(reason)
- Осознание последствий невызова resolve/reject (утечка памяти, висящий promise)
Типичные ошибки
- Вызов
resolveиrejectнесколько раз - последующие игнорируются, но код выполняется - Перепутывание аргументов:
resolveс ошибкой илиrejectс результатом - Ожидание, что
rejectостановит выполнение executor - нет, код продолжается - Забывание вызвать
resolveилиrejectв некоторых ветках условий - Использование
resolveвнутриcatchбез проверки - может подавить реальную ошибку
> Похожие задачи по frontend
Что происходит с функцией в Map, пока на Map есть ссылка в JavaScript
В чем отличие контекста в строгом режиме и без него в JavaScript
Какой тип данных должна возвращать функция retry в JavaScript
Почему нельзя использовать Map вместо объекта для возвращаемого значения метода groupBy в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью