Недавно я задумался над тем, как обещания реализованы в javascript, и решил холодным зимним вечером написать свою версию на Typescript.

Введение в обещание в javascript
Промис - это объект, который содержит состояние разрешения данной асинхронной функции и позволяет вам выполнять некоторые действия (считывать обратные вызовы) на основе состояния разрешения данной асинхронной функции. асинхронная функция.

Проще говоря, обещания - лучший способ написать асинхронный код с обратными вызовами.

Я постараюсь пояснить это на примере.

Рассмотрим следующий код

Это то же самое, что писать это

Это становится лучше, когда вам нужно вызывать другие обратные вызовы внутри обратного вызова (также известный как ад обратного вызова).

Теперь, когда мы увидели, насколько чистыми и простыми являются обещания, давайте разберемся с некоторыми тонкостями обещаний.

Настраиваемый интерфейс
Обещание можно связать с обратными вызовами. Есть три метода, которые следует реализовать в обещании.

  1. then: этот метод вызывается с обратным вызовом, который будет вызываться со значением, с которым было разрешено обещание.
    Он возвращает то же обещание, для которого был вызван then, так что вы можете связать другие then.
    после выполнения обещания каждый обратный вызов будет вызываться с возвращаемым значением предыдущего обратного вызова в том же порядке, в котором они были связаны.
  2. catch: этот метод вызывается с обратным вызовом, который будет вызываться с ошибкой, из-за которой обещание было отклонено.
  3. finally: этот метод вызывается с обратным вызовом, который будет вызван в конце с текущим значением обещания, независимо от того, было ли обещание выполнено или отклонено.

Конструктор обещания
Обещание примет функцию как конструктор. Функция должна принимать два обратных вызова, resolve и reject, каждый из которых сам является функцией.
Эта функция должна выполнять фактическое требуемое асинхронное действие и вызывать resolve с любым значением или reject с ошибкой, если асинхронное действие выполнено успешно или не удалось. .

Прочие сложности

Вызов then с обратным вызовом для уже решенного обещания немедленно вызовет данный обратный вызов с текущим значением обещания.

Вызов catch с обратным вызовом для обещания, которое уже отклонено, немедленно вызовет данный обратный вызов с ошибкой, с которой обещание было отклонено.

Обладая вышеуказанными знаниями, я написал приведенный ниже код в Typescript.

И это работает !!