# MyPromise **Repository Path**: AlexAnde/my-promise ## Basic Information - **Project Name**: MyPromise - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-07-08 - **Last Updated**: 2021-07-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MyPromise 实现一个类似`Promise`的`MyPromise`,并通过**promise-a+测试** 内部持有两个队列,分别存储`onfulfilled`和`onrejected`的函数回调,等待`resolve`/`reject`调用时,将函数回调们依次通过`setTimeout`函数加入任务队列,等待被引擎调用。 ## 构造函数 传入一个函数作为参数,函数体执行异步操作,并通过`resolve`和`reject`函数进行状态转换。 ### 状态 三种状态:`PENDING`,`FULFILLED`,`REJECTED`. 状态只能从`PENDING`转向后两者之一,且只能转换一次。 ## then (onfulfilled, onrejected) 传入两个函数参数。 如果当前`Promise`处于`PENDING`状态,则不知道他将会转移成什么状态,则需要将两个函数参数都存起来。而且因为`then`可以调用多次,且当状态发生转移时,存储的函数回调需要按照放入的顺序执行,所以需要两个队列`onFulfilledCallbacks`/`onRejectedCallbacks`分别存储两个函数。 ### onfulfilled 状态从`PENDING`转`FULFILLED`的时候调用 返回值分为两类,一类是Promise,一类是其他 Promise实际上是对其他类型数据的封装,当Promise的异步操作结束后,将可以拿到所需的数据(如果数据依然是Promise则继续解析),从而继续通过`then`的链式调用将解析得到的数据传递下去 ### onrejected 状态从`PENDING`转`REJECTED`的时候调用 返回值分为两类,一类是Promise,一类是其他 Promise实际上是对其他类型数据的封装,当Promise的异步操作结束后,将可以拿到所需的数据(如果数据依然是Promise则继续解析),从而继续通过`then`的链式调用将解析得到的数据传递下去 ### then的返回值 返回一个`MyPromise`对象,保证`then`的链式调用。该对象的`value`/`reason`由调用这个`then`函数的`Promised`的`onfulfilled`/`onrejected`函数的返回值解析得到的数据决定。该对象的状态由上一个`Promised`的`onfulfilled`/`onrejected`执行情况决定,如果正常执行则`resolve`,抛出异常则`reject`。 ## resolve 将状态从`PENDING`转到`FULFILLED` 将`onfulfilled`回调队列中的所有回调加入事件队列 ## reject 将状态从`PENDING`转到`REJECTED` 将`onrejected`回调队列中的所有回调加入事件队列