1. Promise状态
- pending
- fulfilled
- 不能转为别的状态
- 必须有一个不可变(内存地址)的返回值
- rejected
- 不能转为别的状态
- 必须有一个不可变(内存地址)的返回原因
graph LR
([pending]) --> ([fulfilled]) --> ([必须有一个不可变(内存地址)的返回值])
([pending]) --> ([rejected]) --> ([必须有一个不可变(内存地址)的返回原因])
2. then方法
- promise.then(onFulfilled,onRejected)
- onFulfilled与onRejected如果不是函数,忽略
- onFulfilled/onRejected 如果是函数
- 在Fulfilled/Rejected后调用,把promise的成功值/失败原因作为第一个参数
- 在成功/失败之前不能被调用
- 该函数只执行一次
- onFulfilled/onRejected必须被作为函数调用
- then可以被同一个promise多次调用(回调按照调用顺序执行)
- then必须返回一个promise
3. 处理过程
- 如果 promise 和 x 是相同的, 则以 promise的 TypeError 报错.
- 如果 x 是一个 promise对象, 则使 promise 接受 x 的状态:
- 如果 x 处于等待状态, promise 需保持为等待态直至 x 被执行或拒绝
- 如果 x 处于执行态,用相同的值执行 promise
- 如果 x 处于拒绝态,用相同的据因拒绝 promise
- x 是对象或者函数时
- 把 x.then 赋值给 then 方法
- 如果在获取属性x.then的过程中导致抛出异常e,则拒绝promise 并用e 作为拒绝原因。
- 如果then是函数,则将x作为函数的作用域的this被绑定并调用。传递两个回调函数作为参数,第一个参数叫做resolvePromise,第二个参数叫做rejectPromise:
- 如果 resolvePromise 以值 y为参数被调用,则运行 [[Resolve]](promise, y)
- 如果rejectPromise 以据因r为参数被调用,则以据因r拒绝promise
- 如果resolvePromise 和 rejectPromise均被调用,或者被同一参数调用了多次,则优先采用首次调用并忽略剩下的调用
- 如果调用then方法抛出了异常e:
- 如果resolvePromise 或rejectPromise已经被调用,则忽略它
- 否则以e为拒绝promise 的原因
- 如果then不是函数,以x为参数执行 promise
- 如果x不是对象或者函数,以x为参数执行 promise
二、实现