关于Promise A+ 规范 Promise如何运行 手写Promise

Promise A+ 规范

术语

  1. Promise 有太狠方法的对象或者函数
  2. thenable 是一个有then方法或者是函数
  3. value Promise状态成功时的值, resolve(value),string number boolean undefined thenable promise
  4. reason Promise状态失败时的值,reject(reason)
  5. exception 使用throw抛出的异常

规范

Promise status

有三种状态,他们之间的流转关系

1.pending

1.1 初始状态,可改变  
1.2 在resolve和reject前都处于这个状态  
1.3 通过resolve -> fulfilled 状态  
1.4 通过reject -> rejected 状态  

2.fufilled

2.1 最终态,不可变   
2.2 一个Promise被resolve之后会变成这个状态   
2.3 必须拥有一个value   

3.rejected

3.1 最终态,不可变  
3.2 一个Promise被reject之后会变成这个状态  
3.3 必须拥有一个reason  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6CDpmqAk-1618218020114)(6DDAA4283CB94F7FA56B415367AD45F7)]

then

promise 应该提供一个then方法,用来访问最终的结果,无论 value 还是 reason。

promise.then(pnFulfilled, onRejected)

1.参数规范

1.1 onFulfilled 必须输函数类型,如果传入的不是函数,应该忽略。  
1.2 onRejected 必须输函数类型,如果传入的不是函数,应该忽略。 

2.onFulfilled特性

2.1 在Promise变成fulfilled时,应该调用onFulfilled,参数是value(onFulfilled的执行时机?)
2.2 在Promise变成onFulfilled之前,不应该调用onFulfilled。
2.3 只能被调用一次(怎么实现只调用一次?)

3.onRejected特性

3.1 在Promise变成rejected时,应该调用onRejected,参数是reson。
3.2 在Promise变成onRejected之前,不应该调用onRejected。
3.3 只能被调用一次

4.onFulfilledonRejected应该是微任务阶段执行。

5.then方法可以被调用多次

5.1 promise状态变成 fulfilled 后,所有的 onFulfilled 回调都需要按照then的顺序执行, 也就是按照注册顺序执行(所以在实现的时候需要一个数组来存放多个onFulfilled的回调)  
5.2 promise状态变成 rejected 后,所有的 onRejected 回调都需要按照then的顺序执行, 也就是按照注册顺序执行(所以在实现的时候需要一个数组来存放多个onRejected的回调)

6.返回值
then 应该返回一个promise

```js
promise2 = promise1.then(onFulfilled, onRejected);
```


6.1 onFulfilled 或 onRejected 执行的结果为x, 调用 resolvePromise( 这里大家可能难以理解, 可以先保留疑问, 下面详细讲一下resolvePromise是什么东西 )  
6.2 如果 onFulfilled 或者 onRejected 执行时抛出异常e, promise2需要被reject  
6.3 如果 onFulfilled 不是一个函数, promise2 以promise1的value 触发fulfilled  
6.4 如果 onRejected 不是一个函数, promise2 以promise1的reason 触发rejected

7.resolvePromise

resolvePromise(promise2, x, resolve, reject)
7.1 如果 promise2 和 x 相等,那么 reject TypeError
7.2 如果 x 是一个 promsie
        如果x是pending态,那么promise必须要在pending,直到 x 变成 fulfilled or rejected.
        如果 x 被 fulfilled, fulfill promise with the same value.
        如果 x 被 rejected, reject promise with the same reason.
7.3 如果 x 是一个 object 或者 是一个 function
    let then = x.then.
    如果 x.then 这步出错,那么 reject promise with e as the reason.
    如果 then 是一个函数,then.call(x, resolvePromiseFn, rejectPromise)
        resolvePromiseFn 的 入参是 y, 执行 resolvePromise(promise2, y, resolve, reject);
        rejectPromise 的 入参是 r, reject promise with r.
        如果 resolvePromise 和 rejectPromise 都调用了,那么第一个调用优先,后面的调用忽略。
        如果调用then抛出异常e 
            如果 resolvePromise 或 rejectPromise 已经被调用,那么忽略
            则,reject promise with e as the reason
    如果 then 不是一个function. fulfill promise with x.


这段描述看起来非常的空洞乏味, 最重要的是看不懂! 所以待会实现代码的时候, 同学们注意一下resolvePromise函数具体的实现, 结合代码来看会好很多.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值