150 строк для достижения 90% функциональности Promise

внешний интерфейс GitHub Promise

Реализация Promise — тоже старая тема, в интернете много статей и примеров кода одного типа, и многие из них — отличные реализации. Однако из-за «волшебного» API Promise и содержащейся в нем уникальной идеи асинхронной обработки реализация Promise по-прежнему остается сложной и интересной задачей.

Здесь я даю собственную реализацию. Чтобы лучше объяснить процесс реализации, я разделил реализацию Promise на 10 этапов и выполнил следующую кодовую базу в соответствии с правилом коммита по одному этапу за раз.

GitHub.com/coolingtower0223/pro…

Эта реализация в основном охватывает следующие функции Promise:

  1. основные навыки:promise — это объект, который принимает функцию в качестве параметра. Когда обещание создается, функция выполняется немедленно.

  2. Настройка асинхронных операций: вызываемыйPromise.prototype.thenчтобы установить некоторые будущие завершенные действия. Когда объект обещания будет разрешен, будет вызвана функция обратного вызова в теле then и будет получено асинхронное значение.

  3. цепной вызов:передачаPromise.prototype.thenвернет новый объект обещания. В цепочке промисов, когда выполняются шаги в первом промисе, цепочка автоматически продолжит попытки разрешить последующие промисы до конца.

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

  5. обработка ошибок: Существует несколько способов обработки ошибок в промисах: вызовPromise.prototype.thenПри передаче функции обработки ошибок или вызовеPromise.prototype.catch.

  6. ошибка доставки: когда состояние обещания в цепочке становится отклоненным, ошибка передается в конец цепочки до тех пор, пока не будет найден обработчик ошибки или тело перехвата. Асинхронные операции между местоположением отклонения и обработчиком ошибок выполняться не будут. Когда ошибка будет обработана, цепочка обещаний возобновит выполнение.

  7. Автоматическое разрешение промисов в телах then/catch: когда функция обратного вызова, установленная в теле then/catch, возвращает промис, промис будет автоматически разрешен, а значение или сгенерированная им ошибка также будут переданы последующим промисам.

  8. ловушка исключения: объект обещания может быть не только явно отклонен, но также может перехватывать исключения или ошибки, вызванные его собственным выполнением.

  9. статический метод: Promise.resolve, Promise.reject, Promise.all & Promise.reject

  10. Несколько вызовов затем: несколько вызововPromise.prototype.thenНекоторые асинхронные операции могут выполняться одновременно.

Для вышеописанной функции, также помеченной кодовой библиотекой 10, соответствующей тегу, вы видите облегчение передачи обслуживания.

Наконец, спасибо за то, что снялись, поделились и пообщались!