promiseA+规范

330 阅读2分钟

任何符合promise规范的对象或者函数都可以成为promise,promise A plus 规范地址:promisesaplus.com/

术语

Promise: Promise是一个拥有then方法的对象或者函数,其行为符合本规范。

具有then方法(thenable): 是一个定义了then方法的对象或者函数;

值(value): 指任何javaScript的合法值 (包括undefine,thenable 和 promise)

异常(exception): 是使用throw语句抛出的一个值

原因(reason): 表示一个promise的拒绝原因

要求

promise 的状态

⼀个 Promise 的当前状态必须为以下三种状态中的⼀ 种:等待态(Pending)、已完成(Fulfilled)和已拒 绝(Rejected)。

  • 处于等待态时,promise 需满⾜以下条件:可以变为 「已完成」或「已拒绝」
  • 处于已完成时,promise 需满⾜以下条件:1. 不能迁 移⾄其他任何状态 2. 必须拥有⼀个不可变的值
  • 处于已拒绝时,promise 需满⾜以下条件:1. 不能迁 移⾄其他任何状态 2. 必须拥有⼀个不可变的原因

必须有⼀个 then ⽅法

⼀个 promise 必须提供⼀个 then ⽅法以访问其当前值 和原因。

promise 的 then ⽅法接受两个参数:promise.then(onFulfilled, onRejected) 他们都是可选参数,同时他们都是函数,如果onFulfilled 或 onRejected 不是函数,则需要忽略他们。

解决过程

如果 x 为 Object 或 function(不常⻅)

  • 首先尝试执行x.then
  • 如果取 x.then 的值时抛出错误 e ,则以 e 为据因拒绝 promise
  • 如果 then 是函数,将 x 作为函数的作⽤域 this调⽤。传递两个回调函数作为参数,第⼀个参数叫做 resolvePromise ,第⼆个参数叫做rejectPromise:
  • 如果 then 不为函数,以 x为参数将 promise 变为已完成状态

如果 x 不为对象或者函数,以 x 为参数将 promise变为已完成状态(重要且常⻅)

总结

  1. catch ⾥⾯有 throw ,return 了⼀个 已拒绝的promise,只有这两种情况,catch 之后还会进⼊catch,否则 catch 之后进⼊ then
  2. ⼀个 Promise 的当前状态必须为以下三种状态中的⼀种:等待态(Pending)、已完成(Fulfilled)和已拒绝(Rejected)且状态不可逆
  3. then必须返回一个promise