promise A+规范
什么是Promise A+规范
答:它一个开放、健全且通用的 JavaScript Promise 标准,由开发者制定,供开发者参考。Promise A+规范实际上是把之前 Promise/A 规范 (opens new window) 中的建议,明确成为了行为标准:我们一方面扩展了原有规范约定俗成的行为,一方面删减了原规范的一些特例情况和有问题的部分。 Promises/A+ 规范不设计如何创建、解决和拒绝 promise,而是专注于提供一个通用的 then 方法;
提示
如果你想写出一个规范的 Promise,我们就需要遵循这个标准——Promise A+规范。
# 术语
- promise:是一个拥有
then方法的对象或函数,其行为符合本规范。 - thenable:是一个定义了
then方法的对象或函数。 - 值(value):指任何 JavaScript 的合法值(包括
undefined, thenable 和 promise); - 异常(exception):是使用
throw语句抛出的一个值。 - 据因(reason):表示一个 promise 的拒绝原因。
# 要求
Promise 的状态:一个 Promise 的当前状态必须为以下三种状态中的一种:等待态(Pending)、执行态(Fulfilled)和拒绝态(Rejected)。
- Pending: 处于等待态时,promise 需满足以下条件。
- 可以迁移至执行态或拒绝态。
- Fulfilled:处于执行态时,promise 需满足以下条件。
- 不能迁移至其他任何状态。
- 必须拥有一个不可变的终值。
- Rejected:处于拒绝态时,promise 需满足以下条件。
- 不能迁移至其他任何状态。
- 必须拥有一个不可变的据因。
- 这里的不可变指的是恒等(===),而不是意味着更深层次的不可变(盖指当 value 或 reason 不是基本值时,只要求其引用地址相等,但属性值可被更改)。
- Pending: 处于等待态时,promise 需满足以下条件。
Then 方法:一个 promise 必须提供一个
then方法以访问其当前值、终值和据因。// 一个 promise 的then方法接受两个参数: promise.then(onFulfilled, onRejected)1
2onFulfilled和onRejected都是可选参数。- 如果
onFulfilled不是函数,其必须被忽略。 - 如果
onRejected不是函数,其必须被忽。
- 如果
onFulfilled:如果
onFulfilled是一个函数。- 当
promise执行结束后其必须被调用,并将promise的值作为它的第一个参数。 - 在
promise完成之前不能调用它。 - 它不能被多次调用,其调用次数不可超过一次。
- 当
onRejected:如果
onRejected是函数。- 当
promise被拒绝执行后其必须被调用,其第一个参数为promise的据因(``reason`)。 - 在
promise被拒绝之前不能调用它。 - 它不能被多次调用,其调用次数不可超过一次。
- 当
onFulfilled和onRejected在执行上下文 (opens new window)堆栈仅包含平台代码之前不得调用. [ 3.1 (opens new window) ]。onFulfilled和onRejected必须被当做函数调用 (即函数体内的this为undefined). [ 3.2 (opens new window) ]对于一个
promise,它的then方法可以调用多次。- 当
promisefulfilled后,所有onFulfilled都必须按照其注册顺序执行。 - 当
promiserejected后,所有OnRejected都必须按照其注册顺序执行。
- 当
then必须返回一个promise [ 3.3 (opens new window) ].promise2 = promise1.then(onFulfilled, onRejected);1- 如果
onFulfilled或onRejected返回了值x, 则执行Promise 解析流程[[Resolve]](promise2, x)。 - 如果任一
onFulfilled或onRejected抛出了异常e, 则promise2应当以e为reason被拒绝。 - 如果
onFulfilled不是函数并且promise1已经fulfilled,则promise2必须以promise1的值fulfilled。 - 如果
onReject不是一个函数且promise1已经rejected, 则promise2必须以相同的reason被拒绝.
- 如果
# Promise解析过程
Promise解析过程 是以一个promise和一个值做为参数的抽象过程,可表示为
[[Resolve]](promise, x)
- 如果
promise和x指向相同的值, 使用TypeError做为原因将promise拒绝。 - 如果
x是一个promise, 采用其状态 [ 3.4 (opens new window) ];- 如果
x是pending状态,promise必须保持pending状态,直到xfulfilled或rejected。 - 如果
x是fulfilled状态,将x的值用于fulfillpromise。 - 如果
x是rejected状态, 将x的原因用于rejectpromise。
- 如果
- 如果
x是一个对象或一个函数:- 将
then赋为x.then.[ 3.5 (opens new window) ] - 如果在取
x.then值时抛出了异常,则以这个异常做为原因将promise拒绝。 - 如果
then是一个函数, 以x为this调用then函数, 且第一个参数是resolvePromise,第二个参数是rejectPromise,且:- 当
resolvePromise被以y为参数调用, 执行[[Resolve]](promise, y)。 - 当
rejectPromise被以r为参数调用, 则以r为原因将promise拒绝。 - 如果
resolvePromise和rejectPromise都被调用了,或者被调用了多次,则只第一次有效,后面的忽略。 - 如果在调用
then时抛出了异常,则:- 如果
resolvePromise或rejectPromise已经被调用了,则忽略它。 - 否则, 以
e为reason将promise拒绝。
- 如果
- 当
- 如果
then不是一个函数,则 以x为值fulfillpromise。
- 将
- 如果
x不是对象也不是函数,则以x为值 fulfillpromise。
# 参考资料
官方文档:https://promisesaplus.com/
详解Promise/Promise/A+ 规范:https://www.jianshu.com/p/2207b01e1174
Promise/A+规范:https://segmentfault.com/a/1190000002452115