Promise A+ 规范
术语
- Promise 有太狠方法的对象或者函数
- thenable 是一个有then方法或者是函数
- value Promise状态成功时的值, resolve(value),string number boolean undefined thenable promise
- reason Promise状态失败时的值,reject(reason)
- 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.onFulfilled和 onRejected应该是微任务阶段执行。
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函数具体的实现, 结合代码来看会好很多.