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)
。