Реализация Promise — тоже старая тема, в интернете много статей и примеров кода одного типа, и многие из них — отличные реализации. Однако из-за «волшебного» API Promise и содержащейся в нем уникальной идеи асинхронной обработки реализация Promise по-прежнему остается сложной и интересной задачей.
Здесь я даю собственную реализацию. Чтобы лучше объяснить процесс реализации, я разделил реализацию Promise на 10 этапов и выполнил следующую кодовую базу в соответствии с правилом коммита по одному этапу за раз.
GitHub.com/coolingtower0223/pro…
Эта реализация в основном охватывает следующие функции Promise:
-
основные навыки:promise — это объект, который принимает функцию в качестве параметра. Когда обещание создается, функция выполняется немедленно.
-
Настройка асинхронных операций: вызываемый
Promise.prototype.then
чтобы установить некоторые будущие завершенные действия. Когда объект обещания будет разрешен, будет вызвана функция обратного вызова в теле then и будет получено асинхронное значение. -
цепной вызов:передача
Promise.prototype.then
вернет новый объект обещания. В цепочке промисов, когда выполняются шаги в первом промисе, цепочка автоматически продолжит попытки разрешить последующие промисы до конца. -
государственный контроль: после создания объекта-обещания начальное состояние находится в состоянии ожидания, а затем он либо разрешается, либо отклоняется.
-
обработка ошибок: Существует несколько способов обработки ошибок в промисах: вызов
Promise.prototype.then
При передаче функции обработки ошибок или вызовеPromise.prototype.catch
. -
ошибка доставки: когда состояние обещания в цепочке становится отклоненным, ошибка передается в конец цепочки до тех пор, пока не будет найден обработчик ошибки или тело перехвата. Асинхронные операции между местоположением отклонения и обработчиком ошибок выполняться не будут. Когда ошибка будет обработана, цепочка обещаний возобновит выполнение.
-
Автоматическое разрешение промисов в телах then/catch: когда функция обратного вызова, установленная в теле then/catch, возвращает промис, промис будет автоматически разрешен, а значение или сгенерированная им ошибка также будут переданы последующим промисам.
-
ловушка исключения: объект обещания может быть не только явно отклонен, но также может перехватывать исключения или ошибки, вызванные его собственным выполнением.
-
статический метод:
Promise.resolve
,Promise.reject
,Promise.all
&Promise.reject
-
Несколько вызовов затем: несколько вызовов
Promise.prototype.then
Некоторые асинхронные операции могут выполняться одновременно.
Для вышеописанной функции, также помеченной кодовой библиотекой 10, соответствующей тегу, вы видите облегчение передачи обслуживания.
Наконец, спасибо за то, что снялись, поделились и пообщались!