promiseA+规范

393 阅读4分钟

一、是什么

PromiseA+是一个开放、健全且通用的 JavaScript Promise 标准, ES6的promise以及电池API就是用的promiseA+规范进开发

二、术语

  • promise: 是一个拥有then方法的合法的对象或者函数
  • thenable:是定义then方法的函数或者对象
  • reson:解释promise状态为reject的原因
  • value:任何参数,包含undefined then promise
  • exception:表示throw语句爆出异常的数据

三、必须知道的promiseA+规范

1、状态

一个promise一定存在三个状态,分别是pending, fulfilled, rejected

  • 1、pending(等待状态):此时promise的状态可以转化为fulfilled或者rejected状态
  • 2、fulfilled(完成状态):不能切换到其他状态,并且会返回一个固定的数据value
  • 3、rejected(失败状态):不能切换到其他的状态,并且有一个不可变的原因reason

2、then方法

promise最终会提供一个then方法来访问当前的返回的value或者reson。 then方法拥有两个参数promise.then(onFullfilled,onReject),两个参数都是可选的。

  • 1、onFullfilled特性:执行完成之前被调用一次,返回的第一个参数调用成功的数据
  • 2、onReject特性:在执行完之前被调用一次,返回的第一个参数为调用失败的原因 调用要求:有且仅有onFullfilled和onReject为函数的情况下才会被调用,如有一个不是函数,则then方法会自动忽略非函数的参数,仅调用为函数的参数

then方法的调用次数: then方法在同一个promise里面可以被多次调用。当promise的状态为fulfilled的时候,所有的onFulfilled都会按照顺序依次执行,反之亦然。 then方法的返回值:then方法会返回一个promise

3、promise方法调用过程

Promise 解决过程 是一个抽象的操作,其需输入一个 promise 和一个值,我们表示为 [[Resolve]](promise, x),如果 x 有 then 方法且看上去像一个 Promise ,解决程序即尝试使 promise 接受 x 的状态;否则其用 x 的值来执行 promise 。 这种 thenable 的特性使得 Promise 的实现更具有通用性:只要其暴露出一个遵循 Promise/A+ 协议的 then 方法即可;这同时也使遵循 Promise/A+ 规范的实现可以与那些不太规范但可用的实现能良好共存。 运行 [[Resolve]](promise, x) 需遵循以下步骤:

x为promise的情况下

  • x 与 promise 相等:如果 promise 和 x 指向同一对象,以 TypeError 为据因拒绝执行 promise
  • x 为 Promise:如果 x 为 Promise ,则使 promise 接受 x 的状态:注4
  • x 处于等待态: promise 需保持为等待态直至 x 被执行或拒绝
  • x 处于执行态:用相同的值执行 promise
  • x 处于拒绝态:用相同的据因拒绝 promise

x 为对象或者函数

  • x 为对象或者函数:把 x.then 赋值给 then 取 x.then 的值时抛出错误 e:以 e 为据因拒绝 promise
  • 如果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 不为对象或者函数,以 x 为参数执行 promise

如果一个 promise 被一个循环的 thenable 链中的对象解决,而 [[Resolve]](promise, thenable) 的递归性质又使得其被再次调用,根据上述的算法将会陷入无限递归之中。算法虽不强制要求,但也鼓励施者检测这样的递归是否存在,若检测到存在则以一个可识别的 TypeError 为据因来拒绝 promise。

四、参考学习文档

Promise英文文档:promisesaplus.com/#terminolog…