← Назад к вопросам
Откуда в Promise берутся resolve и reject
2.0 Middle🔥 251 комментариев
#JavaScript Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Откуда берутся resolve и reject в Promise
resolve и reject — это функции, которые передаются в конструктор Promise в качестве аргументов. Когда вы создаете новый Promise, вы получаете эти две функции для контроля его состояния.
Как это работает
When you create a Promise, you pass a callback function (called executor) to the constructor. This executor function automatically receives two parameters: resolve and reject.
new Promise((resolve, reject) => {
// resolve и reject - это функции
// Вы их вызываете, чтобы изменить состояние Promise
});
Структура Promise конструктора
const promise = new Promise((resolve, reject) => {
// executor функция - выполняется сразу же при создании
// resolve - функция для успешного завершения
// reject - функция для отклонения (ошибка)
});
Простые примеры
Пример 1: Базовый Promise с resolve
const promise = new Promise((resolve, reject) => {
console.log("Promise создан");
// Вызываем resolve через 1 секунду
setTimeout(() => {
resolve("Успех!");
}, 1000);
});
promise.then(result => {
console.log(result); // "Успех!"
});
Пример 2: Promise с reject
const promise = new Promise((resolve, reject) => {
const error = new Error("Что-то пошло не так");
setTimeout(() => {
reject(error);
}, 1000);
});
promise.catch(error => {
console.log(error.message); // "Что-то пошло не так"
});
Пример 3: Условное выполнение
const promise = new Promise((resolve, reject) => {
const random = Math.random();
if (random > 0.5) {
resolve("Вам повезло!");
} else {
reject("Не повезло...");
}
});
promise
.then(result => console.log(result))
.catch(error => console.log(error));
Детальный разбор: откуда они берутся
Шаг за шагом
// Шаг 1: Создаем новый Promise
const myPromise = new Promise((resolve, reject) => {
// Шаг 2: JavaScript автоматически создает функции resolve и reject
// и передает их в качестве аргументов функции executor
// Шаг 3: Мы можем вызвать эти функции
resolve("данные");
// или
reject(new Error("ошибка"));
});
Ключевой момент: resolve и reject — это внутренние функции Promise, которые JavaScript автоматически создает и передает вам.
Что делают resolve и reject
resolve(value)
const promise = new Promise((resolve, reject) => {
// resolve меняет состояние Promise на "fulfilled"
resolve(42);
});
promise.then(value => {
console.log(value); // 42
});
resolve передает значение в then() обработчик.
reject(reason)
const promise = new Promise((resolve, reject) => {
// reject меняет состояние Promise на "rejected"
reject(new Error("Ошибка!"));
});
promise.catch(error => {
console.log(error.message); // "Ошибка!"
});
reject передает причину ошибки в catch() обработчик.
Состояния Promise
const promise = new Promise((resolve, reject) => {
// Состояние: "pending" (ожидание)
// Это состояние до вызова resolve или reject
setTimeout(() => {
resolve("данные");
// Состояние: "fulfilled" (выполнено)
}, 1000);
});
Три состояния Promise:
- Pending — начальное состояние, Promise ещё выполняется
- Fulfilled — Promise выполнен успешно, вызван resolve()
- Rejected — Promise отклонен, вызван reject()
Практический пример: fetch с Promise
function fetchUser(userId) {
return new Promise((resolve, reject) => {
// Симуляция API запроса
setTimeout(() => {
if (userId > 0) {
resolve({
id: userId,
name: "Иван",
email: "ivan@mail.com"
});
} else {
reject(new Error("Неверный ID"));
}
}, 1000);
});
}
// Использование
fetchUser(1)
.then(user => console.log("Пользователь:", user))
.catch(error => console.log("Ошибка:", error.message));
Важные правила
1. Resolve и reject вызываются только один раз
const promise = new Promise((resolve, reject) => {
resolve("первый");
resolve("второй"); // этот вызов будет проигнорирован
reject(new Error("ошибка")); // и этот тоже
});
promise.then(value => {
console.log(value); // "первый" (только первый вызов действует)
});
2. Нельзя использовать оба одновременно
const promise = new Promise((resolve, reject) => {
if (success) {
resolve(data); // используем resolve
} else {
reject(error); // или reject, но не оба
}
});
3. Можно передать другой Promise
const promise1 = new Promise((resolve, reject) => {
resolve(42);
});
const promise2 = new Promise((resolve, reject) => {
resolve(promise1); // resolve может получить другой Promise
});
promise2.then(value => {
console.log(value); // 42
});
Современный подход: async/await
// Вместо явного использования Promise:
async function getData() {
return new Promise((resolve, reject) => {
resolve("данные");
});
}
// Лучше использовать async/await:
async function getData() {
return "данные";
// или
throw new Error("ошибка");
}
const data = await getData();
Практический пример: обработка ошибок
function loadJSON(url) {
return new Promise((resolve, reject) => {
fetch(url)
.then(response => {
if (!response.ok) {
reject(new Error("HTTP ошибка"));
}
return response.json();
})
.then(data => resolve(data))
.catch(error => reject(error));
});
}
loadJSON("https://api.example.com/data")
.then(data => console.log("Успех:", data))
.catch(error => console.log("Ошибка:", error.message));
Ключевые выводы
- resolve и reject — это функции, автоматически передаваемые в executor функцию Promise
- resolve используется для успешного завершения Promise
- reject используется для отклонения Promise при ошибке
- Каждый из них может быть вызван только один раз
- Promise гарантирует, что состояние не изменится после первого вызова resolve или reject
- В современном коде используйте async/await вместо явного создания Promise