24.9 备忘单: ECMAScript 6 Promise API

本节给出 ECMAScript 6 Promise API 的一个概览,和规范中描述的一样。

24.9.1 Promise 相关术语

Promise API 是关于异步返回结果的。一个 Promise 对象(简称 Promise )就是一个结果的替身,结果将会通过这个对象返回。

状态:

  • 一个 Promise 总是处于三个互相排斥状态中的一种:
    • 在结果就绪之前, Promise 变为“未完成( pending )”状态。
    • 计算结果就绪, Promise 变为“已完成( resolved 或 fulfilled )”状态。
    • 如果发生了错误, Promise 变为“已失败( rejected )”状态。
  • 如果“所有事情都完成了”(也就是说要么完成要么失败),那么 Promise 就稳定了。
  • Promise 仅会稳定一次,然后就保持不变了。

状态改变的回调函数:

  • Promise 回调函数就是利用 Promise 的 then() 方法注册的那些函数,在 Promise 完成或失败的时候会调用相应的回调函数。
  • 一个 thenable 实体是一个有 Promise 风格的 then() 方法的对象。 API 只关心在 Promise 稳定的时候能够收到通知,因此只需要 thenable 实体。

改变状态:有两种操作可以改变 Promise 的状态。在执行了一次两种操作中的一种之后,将来再执行这两种操作中的任何一种都没有效果了。

  • Promise 失败意味着 Promise 变为了已失败状态。
  • Promise 完成有不同的效果,依赖于完成的值:
    • 完成的值是一个普通的(非 thenable 的)值,会使当前 Promise 变为已完成。
    • Promise P 完成之后得到一个 thenable 的 T ,意味着 P 不能再变为已完成状态,并且后面将会追踪 T 的状态,包括 T 的已完成和已失败的值。一旦 T 稳定了,相应的 P 的回调函数就会被调用(或者,如果已经稳定,则会立马调用)。

24.9.2 Promise 构造器

Promise 构造器像下面这样调用:

let p = new Promise(function (resolve, reject) { ··· });

这个构造器的回电函数被称作执行者( executor )。执行者可以使用它的参数来使新的 Promise p 完成或失败。

  • resolve(x) 使 p 完成,并返回 x 作为结果:
    • 如果 x 是 thenable 的,它的稳定消息就会转发给 p (这会触发通过 then() 注册的回调函数)。
    • 否则, p 变成已完成状态,返回的结果是 x

24.9.3 静态的 Promise 方法

Promise 的所有静态方法支持子类化:

* 它们通过所谓的种模式(这在关于类的那一章有详细讲解)创建新的 Promise 实例。
    * 默认情况下使用接收器( this )作为构造器。
    * 默认值可以通过在子类中重写 `[Symbol.species]` 来覆盖。
* 其它静态方法也通过种模式访问(而不是通过 `Promise` 或者 `this` )。

24.9.3.1 创建 Promise

下面的两个静态方法创建它们的新的接收器实例:

  • Promise.resolve(x) :将任何值装换为 Promise 对象,使其和 thenable 、 Promise 表现一致。
    • 如果 x 是 thenable 的,就会被转换成 Promise - 一个接收器实例( this ;此处未使用种模式)。
    • 如果 x 是接收器实例,该实例会被直接返回。
    • 否则,返回接收器的新实例,该实例处于完成状态,返回值是 x
  • Promise.reject(reason) :创建一个新的接收器实例(就像种模式中配置的一样),该实例处于失败状态,返回值是 reason

24.9.3.2 组合 Promise

从表面上看,静态方法 Promise.all()Promise.race() 将一组可迭代的 Promise 转变为一个单一的 Promise 。也就是说:

  • 可迭代。迭代器的元素通过 this.resolve() 转换为 Promise 。
  • 返回一个新的 Promise 对象。该 Promise 对象是一个新的接收器实例(正如通过种模式配置的一样)。

方法是:

  • Promise.all(iterable) :返回一个 Promise ...
    • 如果迭代器中所有元素都处于已完成状态,则返回的 Promise 对象就处于已完成状态。已完成的值:已完成值的数组。
    • 如果有任何一个元素处于已失败状态,则返回的 Promise 对象就处于已失败状态。已失败的值:第一个失败元素的返回值。
  • Promise.race(iterable) :迭代器中只要有一个元素处于稳定状态,那么返回的 Promise 就会立马变为一样的稳定状态。

24.9.4 Promise.prototype 上的方法

24.9.4.1 Promise.prototype.then(onFulfilled, onRejected)

* onFulfilled 和 onRejected 回调函数被称为 reactions 。
* 如果 Promise 已完成或者只要 Promise 变成已完成状态,就会立刻调用 onFulfilled 。类似地,在失败的时候也会调用 `onRejected` 。
* `then()` 返回一个新的 Promise Q ( 通过接收器的构造函数种类 ):
    * 如果两个回调函数中的一个返回值, Q 以该值变为 resolved 状态。
    * 如果两个回调函数中的一个抛出异常, Q 以该异常变为 rejected 状态。
* 省略回调函数:
    * 如果省略 `onFulfilled` ,那么 fulfilled 状态就会转发给 `then()` 的结果。
    * 如果省略 `onRejected` ,那么 rejected 状态就会转发给 `then()` 的结果。

回调函数的默认实现可能像这样:

function defaultOnFulfilled(x) {
    return x;
}
function defaultOnRejected(e) {
    throw e;
}

24.9.4.2 Promise.prototype.catch(onRejected)

  • p.catch(onRejected) 等价于 p.then(null, onRejected)

results matching ""

    No results matching ""