2021-07-11 Promise规范以及应用
PromiseA+规范
大纲
- PromiseA+规范
- 实现一个promise
- generator async
术语:
- promise是有then方法的对象或者函数
- thenable 是一个有then方法的对象或者是函数
-
value
是promise状态成功时的值, resolve(value), value可以是:string,number,boolean,undefined,thenable promise -
reason
是promise状态失败时的值, reject(reason) - exception 使用throw跑出的异常
规范
Promise States 有三种状态
-
pending
1.1 这是初始状态,可改变的;
1.2 在resolve和reject前都处于这个状态;
1.3 通过resolve -> fulfilled状态;
1.4 通过reject-> rejected状态 -
fulfilled
2.1 这是最终态,不可变;
2.2 一个promise被resolve之后会变成这个状态
2.3 必须拥有一个value值 -
rejected
3.1 最终态,不可变;
3.2 一个promise被reject之后会变成这个状态;
3.3 必须拥有一个reason
总结一下:
pending -> resolve(value) -> fulfilled
pending -> reject(reason) -> rejected
then
promiseA+规定promise应该提供一个then方法,用来访问最终的结果,无论value还是reason。
promise.then(onFulfilled, onRejected)
- 参数规范
1.1 onFulfilled必须是函数类型,如果传入的不是函数,应该被忽略。
1.2 onRejected必须是函数类型,如果传入的不是函数,应该被忽略。 - onFulfilled特性
2.1 在promise变成fulfilled时,应该调用onFulfilled,参数是value。(onFulfilled的执行时机)
2.2 在promise变成fulfilled之前,不应该调用onFulfilled。
2.3 只能被调用一次(怎么实现只调用一次?)。 - onRejected特性
3.1 在promise变成rejected时,应该调用onRejected,参数是reason。
3.2 在promise变成rejected之前,不应该调用onRejected。
3.3 只能被调用一次。 - onFulfilled和onRejected应该是微任务阶段执行。
实现promise的时候,如何去生产微任务? - then方法可以被调用多次
5.1 promise状态变成fulfilled之后,所有的onFulfilled回调都需要按住注册的顺序执行,也可以理解为按照.then的顺序执行。
5.2 promise状态变成rejected之后,所有的onRejected回调都需要按住注册的顺序执行,也可以理解为按照.then的顺序执行。 - 返回值
then应该返回一个promise
const promise2 = promise.then(onFulfilled, onRejected)
6.1 onFulfilled或onRejected执行结果为x,调用resolvePromise
6.2 onFulfilled或onRejected执行过程中抛出了异常,promise2需要被rejected
6.3 如果onFulfilled不是一个函数,promise2应该以promise1的value触发fulfilled
6.4 如果onRejected不是一个函数,promise2应该以promise1的reason触发fulfilled
- resolvePromise
resolvePromise(promise2, x, resolve, reject)
7.1 如果promise2和x相等,reject typeError
7.2 如果x是一个promise
7.2.1 如果x是pending状态,promise必须要在pending状态,直到x的状态变更
7.2.2 如果x是fulfilled,value->fulfilled
7.2.3 如果x是rejected,reason->rejected
7.3 如果x是一个Object/Function
去获取x.then,如果报错reject reason
then是一个函数,then.call(x, resolvePromiseFn, rejectPromiseFn)
一步步实现一个Promise
- const promise = new Promise();,代表Promise应该是一个构造函数或者class
- 定义三种状态
- 初始化状态
- resolve和reject方法
4.1 这两个方法要更改status,从pending编程fulfilled/ rejected
4.2 入参分别是value/reason -
对于实例化promise时的入参处理
用try catch 初始化立刻执行
5.1 入参是一个函数,接收resolve reject两个参数
5.2 初始化promise的时候,就要执行这个函数并且有任何的报错都要通过reject抛出去
-
then方法
6.1 then接收两个参数,onFulfilled和onRejected
6.2 检查并处理参数,如果参数不是函数,就忽略
then方法