Записки погромиста

Записки погромиста на вольные темы

Создание собственного полифила Promise

Полифил Promise — это способ реализовать работу объектов Promise самостоятельно, чтобы старые браузеры или окружения, которые не поддерживают Promise, могли их использовать. Мы создаём свою версию того, как работают промисы.

Простое объяснение, что такое Promise

Promise — это объект, который помогает управлять асинхронными операциями, например, загрузкой данных из интернета. С помощью Promise вы говорите: «Сделай что-то, и когда это будет готово, скажи мне об этом».

Пример:

  1. Представьте, что вы заказали пиццу. Это ваш асинхронный запрос.
  2. Вы можете дождаться (ожидать) её готовности.
  3. Когда пицца будет готова, вы получаете уведомление и можете её съесть (успех).
  4. Если ресторан откажется готовить пиццу, вы получите уведомление о провале.

Это и есть концепция промиса.

Как реализовать полифил 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 секунду: "Пицца готова!"

Пошаговое объяснение

  1. Конструктор MyPromise:
    • Принимает функцию executor (ту, в которой вы вызываете resolve или reject).
    • Сохраняет внутренние переменные, чтобы знать, вызваны ли resolve или reject.
  2. Методы resolve и reject:
    • resolve: говорит, что задача завершилась успешно и передаёт результат.
    • reject: говорит, что задача завершилась с ошибкой.
  3. Методы then и catch:
    • then: выполняет код, если задача завершилась успешно (вызван resolve).
    • catch: выполняет код, если задача завершилась с ошибкой (вызван reject).
  4. Асинхронное поведение:
    • Если вы вызвали then после того, как задача уже завершилась, полифил всё равно выполнит функцию onResolve.

Почему это работает?

Этот полифил воспроизводит базовую функциональность промисов:

  • Он позволяет асинхронным операциям возвращать результат.
  • Он поддерживает методы then для обработки успеха и catch для обработки ошибок.

Хотя в реальной реализации Promise используется гораздо больше возможностей (например, очередь для задач), этот полифил даёт основное представление о работе промисов.

Published by

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