Promise 的术语
promise
是一个有then
方法的对象或者是函数,行为遵循本规范thenable
是一个有then
方法的对象或者是函数value
是promise
状态成功时的值,也就是resolve
的参数, 表示结果的数据reason
是promise
状态失败时的值, 也就是reject
的参数, 表示拒绝的原因exception
是一个使用throw
抛出的异常值
Promise States
三种状态
pending
1.1 初始状态,可改变
1.2 一个promise在resolve或者reject之前,都处于这种状态
1.3 resolve -> fulfilled
1.4 reject -> rejectedfulfilled
2.1 最终态,不可改变
2.2 一个 promise 被 resolve 后变成这个状态
2.3 必须有一个 value 值rejected
3.1 最终态,不可改变
3.2 一个 promise 被 reject 后变成这个状态
3.3 必须有一个 reason 值
then
promise 应该提供一个then犯法,用来访问最终的结果
promise.then(onFulfilled,onRejected)
参数要求
1.1 onFulfilled 必须是函数类型,如果不是函数,应该被忽略
1.2 onRejected 必须是函数类型,如果不是函数类型,应该被忽略onFulfilled 特性
2.1 在 promise 变成 fulfilled 时,应该调用 onFulfilled, 参数是 value
2.2 在 promise 变成 fulfilled 之前,不应该被调用
2.3 只能被调用一次(可能需要一个变量来限制执行次数)onRejected 特性
2.1 在 promise 变成 rejected 时,应该调用 onRejected, 参数是 reason
2.2 在 promise 变成 rejected 之前,不应该被调用
2.3 只能被调用一次(可能需要一个变量来限制执行次数)onRehected 和 onFulfilled 应该是微任务
queueMicrotask 来实现微任务
queueMicrotask(() => { })
then 方法可以被调用多次
const promise = new Promise() promise.then(cb1.cb2) promise.then(cb1.cb2) promise.then(cb1.cb2) promise.then(cb1.cb2)
5.1 promise 变成 fulfilled 后, 所有 onfulfilled 回调都需要按照 then 的 顺序执行(用数组来存放 onFuifilled list)
5.2 promise 变成 rejected 后,所有的 onRejected 回调都需要按照 then 的顺序执行(用数组来存放 onRejected list)then 的返回值
应该返回一个 promisepromise2 = promise1.then(xx,xx)
6.1 onFulfilled 或者 onRejected 执行结果为x, 调用 resolvePromise 方法
6.2 如果 onFulfilled 或者 onRejected 执行时抛出异常e,promise2需要被 rejected
6.3 如果 onFulfilled 不是一个函数,promise2 以 promise1 的 value 触发 fulfilled
6.4 如果 onRejected 不是一个函数,promise2 以 promise1 的 reason 触发 rejectedresolvePromise
resolvePromise(promise2,x,resolve,reject)
7.1 如果 promise2 和 x 全相等, 那么 reject typeError。
7.2 如果 x 是一个 promise
如果 x 是 pending, promise2 一定继续pending ,知道 x 变成了 fulfilled 或者 rejected
如果 x 是 fulfilled , resolve 返回 value
如果 x 是 rejected , reject 返回 reason
7.3 如果 x 是一个object 或者 function```js try { let then = x.then // then 是函数 then.call(x,resolvePromiseFn, rejectePromiseFn) // then 不是函数 resolvePromiseFn 返回 x } catch(e) { reject promise e } ```