PromiseA+ 规范
术语
- promise是一个有then方法的对象或者函数,行为遵循PromiseA+规范
- thenable是一个有then方法的对象或者函数
- value是Promise状态成功时的值,也是resolve的参数,包括各种数据类型, undefined / string / number / boolean / promise ...
- reason是Promise状态失败时的值,也就是reject的参数,表示拒绝的原因
- exception throw 抛出去的异常
规范
Promise States
promise有三种状态,要注意他们之间的关系
- pending
1.1 初始状态,可以改变
1.2 一个promise在被resolve或者reject之前,都处于这个状态
1.3 通过 resolve -> fulfilled
1.4 通过 reject -> rejected - fulfilled
2.1 最终态,不可以改变
2.2 一个promise在被resolve之后变成这个状态
2.3 必须有一个value值 // undefined - rejected
3.1 最终态,不可以改变
3.2 一个promise在被reject之后变成这个状态
2.3 必须有一个reason值 // undefined
pending -> resolve(value) -> fulfilled
pending -> reject(reason) -> rejected
then
promise应该提出一个then方法,用来访问最终的结果,无论是value还是reason。
promsie.resolve(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 实现微任务的调用 then方法可以被调用多次
5.1 promise 变成 fulfilled 后,所有 onfulfilled 回调都应该按照then的顺序执行在实现promsie的时候,咱们需要一个数组来存储 onfulfilled的cb
promise.then(cb1).then(cb2).then(cb3)... // or const promise = new Promsie(); promise.then(cb1); promise.then(cb2); //
5.2 promise 变成 rejected 后,所有 onrejected 回调都应该按照then的顺序执行
在实现promsie的时候,咱们需要一个数组来存储 onrejected的cb
返回值
then的返回值是一个promise,新的? 旧的?promsie2 = promise1.then(onfulfilled, onrejected)
6.1 onfulfilled 和 onrejected 执行的结果为 x,调用 resolvePromise
6.2 onfulfilled 和 onrejected 执行的异常,promsie2需要被rejected
6.3 如果onfulfilled不是一个函数,promsie2 以 promise1的value 触发 fulfilled
6.4 如果onrejected不是一个函数,promsie2 以 promise1的reason 触发 rejectedresolvePromise
resolvePromsie(promise2, x, resolve, reject);
7.1 如果promise2 和 x 相等,那么reject typeError 会死造成死循环,为什么 ???
7.2 如果x 是 promise如果x 是 pending,promise的状态必须也是等待/pending,知道x 变成了 fulfilled / rejected 如果x 是 fulfilled,fulfilled promise width the same value 值的透传 如果x 是 rejected,reject promise width the same reason
7.3 如果x 是一个object 或者是一个 function
let then = x.then; 如果x.then 这一步出错了, try catch(e), reject(e) **如果是一个object 怎么可能会出错 ???** 如果then是一个函数, then.call(x, resolvePromsieFn, rejectedPromiseFn); resolvePromsieFn 入参 y,执行resolvePromsie(promise2, y, resolve, reject); 如果调用then的时候抛出了异常e,reject reason
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。