promiseA+ 标准
常见术语
- promise,一种约定,是一个有 then 办法的对象或者函数,行为遵循本标准
- thenable,一个有 then 办法的对象或者函数
- value,promise 胜利后的值,resolve的参数,类型:number、boolean、undefined、promise
- reason,promise 失败后的值。reject的参数,示意回绝的起因
- exception,异样值
标准
Promise States
有三种状态,pending、fulfilled、rejected
-
pending
1.1 初始状态,可扭转
1.2 一个 Promise 在 resolve/reject 之前都处于这个状态
1.3 resolve: pending => fulfilled 状态
1.4 reject: pending => 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
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 个性
3.1 在 promise 变成 rejected 时,应该调用 onRejected,参数是 reason
3.2 在 promise 变成 rejected 之前,不应该被调用
3.3 只能被调用一次 -
onFulfilled 和 onRejected 执行环境应该在微工作里
微工作:一个高优先级的货色,浏览器提供的微工作办法:queueMicrotask(() => {})
宏工作:setTimeout(() => {}) -
then 办法能够被调用屡次
5.1 promise 状态变成 fulfilled 后,所有的 onFulfilled 回调须要依照 then 的程序执行
5.2 promise 状态变成 rejected 后,所有的 onRejected 回调须要依照 then 的程序执行
const promise = new Promise()
promise.then(cb1, cb2)
promise.then(cb1, cb2)
promise.then(cb1, cb2)
promise.then(cb1, cb2)
-
返回值
then 返回应该是一个新的 promise
const promise1 = new Promise() const promise2 = promise.then(cb1, cb2) promise2.then(cb1, cb2)
6.1 promise1 的 onFulfilled 或者 onRejected 执行后果为 x,调用一个 resolvePromise()(用于解析 Promise,还有异样判断)
6.2 promise1 的 onFulfilled 或者 onRejected 执行后果报错了,此时 promise2 须要被 reject
6.3 promise1 的 onFulfilled 不是一个函数,提供默认函数做透传,promise2 以 promise1 的 value 触发 fulfilled
6.4 promise1 的 onRejected 不是一个函数,提供默认函数做透传,promise2 以 promise1 的 reason 触发 reject -
resolvePromise
resolvePromise(promise2, x, resolve, reject)
7.1 如果 promise2 === x, 则 reject typeError
7.2 如果 x 是一个 Promise,x 是 pending 时,promise2 必须也是 pending x 是 resolve 时,promise2 必须以雷同的 value resolve x 是 reject 时,promise2 必须以雷同的 reason reject
7.3 如果 x 是 object / function
let then = x.then 应用 try...catch... then 如果是一个函数,通过 then.call(x) 来调用(扭转 this 指向的)Object.defineProperty(x, 'then', get() {throw error})