> Как использовать 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 навсегда, что приведёт к утечке памяти и необработанным ожиданиям.

Пример кода

JAVASCRIPT
function readFilePromise(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf8', (err, data) => {
if (err) {
reject(err); // ошибка - rejected
} else {
resolve(data); // успех - fulfilled
}
});
});
}
// Условный resolve/reject
function 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 с другим promise
function 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 без проверки - может подавить реальную ошибку

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

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