Полифил Promise — это способ реализовать работу объектов Promise самостоятельно, чтобы старые браузеры или окружения, которые не поддерживают Promise, могли их использовать. Мы создаём свою версию того, как работают промисы.
Простое объяснение, что такое Promise
Promise — это объект, который помогает управлять асинхронными операциями, например, загрузкой данных из интернета. С помощью Promise вы говорите: «Сделай что-то, и когда это будет готово, скажи мне об этом».
Пример:
- Представьте, что вы заказали пиццу. Это ваш асинхронный запрос.
- Вы можете дождаться (ожидать) её готовности.
- Когда пицца будет готова, вы получаете уведомление и можете её съесть (успех).
- Если ресторан откажется готовить пиццу, вы получите уведомление о провале.
Это и есть концепция промиса.
Как реализовать полифил Promise?
Вот самый простой полифил, который объясняет, как работает Promise внутри:
function MyPromise(executor) {
let onResolve = null;
let onReject = null;
let isResolved = false;
let isRejected = false;
let value = null;
// Метод resolve
function resolve(result) {
isResolved = true;
value = result;
if (onResolve) {
onResolve(value);
}
}
// Метод reject
function reject(error) {
isRejected = true;
value = error;
if (onReject) {
onReject(value);
}
}
// Метод then
this.then = function (callback) {
onResolve = callback;
if (isResolved) {
onResolve(value);
}
return this; // Чтобы поддерживать цепочку вызовов
};
// Метод catch
this.catch = function (callback) {
onReject = callback;
if (isRejected) {
onReject(value);
}
return this;
};
// Выполняем переданный executor (функцию с resolve/reject)
executor(resolve, reject);
}
// Пример использования
let promise = new MyPromise((resolve, reject) => {
setTimeout(() => resolve("Пицца готова!"), 1000);
});
promise.then((result) => console.log(result)); // Через 1 секунду: "Пицца готова!"
Пошаговое объяснение
- Конструктор
MyPromise:- Принимает функцию
executor(ту, в которой вы вызываетеresolveилиreject). - Сохраняет внутренние переменные, чтобы знать, вызваны ли
resolveилиreject.
- Принимает функцию
- Методы
resolveиreject:resolve: говорит, что задача завершилась успешно и передаёт результат.reject: говорит, что задача завершилась с ошибкой.
- Методы
thenиcatch:then: выполняет код, если задача завершилась успешно (вызванresolve).catch: выполняет код, если задача завершилась с ошибкой (вызванreject).
- Асинхронное поведение:
- Если вы вызвали
thenпосле того, как задача уже завершилась, полифил всё равно выполнит функциюonResolve.
- Если вы вызвали
Почему это работает?
Этот полифил воспроизводит базовую функциональность промисов:
- Он позволяет асинхронным операциям возвращать результат.
- Он поддерживает методы
thenдля обработки успеха иcatchдля обработки ошибок.
Хотя в реальной реализации Promise используется гораздо больше возможностей (например, очередь для задач), этот полифил даёт основное представление о работе промисов.

Оставьте комментарий