定义
一个健全的、可互操作的由开发者实现、并服务于开发者的JavaScript promise
的开放标准
Promise
代表异步操作的最终结果。与Promise
交互的主要方式是通过其then
方法,该方法注册回调以接收Promise
的最终值或无法实现Promise
的原因。
该规范详细说明了then
方法的行为。提供了一个可互操作的基础,所有符合Promises/A+
的Promise
实现都可以依赖该基础来提供。因此,规范应该被认为是非常稳定的。尽管Promises/A+
组织可能偶尔会修改此规范,并通过较小的向后兼容更改来解决新发现的极端情况,但只有在仔细考虑、讨论和测试后,我们才会集成较大的或向后不兼容的更改。
从历史上看,Promises/A+
澄清了早期Promises/A+
提案的行为条款,将其扩展到涵盖事实上的行为,并省略了未指定或有问题的部分。
最后,核心Promises/A+
规范不涉及如何创建、履行或拒绝Promise
,而是选择专注于可操作的then
方法。未来的配套规范工作可能会涉及这些主题。
1. 术语
promise
是具有then
方法的对象或函数,其行为符合本规范。thenable
是定义then
方法的对象或函数value
是任何合法的JavaScript
值(包括undefined
、thenable
或promise
)- "异常"是使用
throw
语句抛出的值 - "reason" 是一个值,表示一个承诺被拒绝的原因
2. 要求
2.1 Promise
状态
Promise
必须处于以下三种状态之一:待处理(pending)、已完成(fulfilled)或已拒绝(rejected)。
- pending:
- 可能转换到已经完成或已拒绝状态
- fulfilled:
- 不能过度到任何其他状态
- 必须有一个不能改变的值
- rejected:
- 不能过度到任何其他状态
- 必须有一个理由,这个理由不能改变
2.2 then
方法
Promise
必须提供then
方法来访问其当前或最终的值或原因
Promise
的then
方法接受两个参数
promise.then(onFulfilled, onRejected)
onFulfilled
和onRejected
都是可选参数:- 如果
onFulfilled
不是函数,则必须忽略它。 - 如果
onRejected
不是函数,则必须忽略它。
- 如果
- 如果
onFulfilled
是一个函数:- 它必须在
promise
完成后调用,promise
的值作为它的第一个参数。 - 在
promise
完成之前不能调用它。 - 不能多次调用它。
- 它必须在
- 如果
onRejected
是一个函数:- 它必须在
promise
被拒绝后调用,promise
的原因是它的第一个参数。 - 在
promise
被拒绝之前之前不能调用它。 - 不能多次调用它。
- 它必须在
- 在执行上下文堆栈仅包含平台代码之前,不得调用
onFulfilled
或onRejected
。 onFulfilled
和onRejected
必须作为函数调用。then
可能会在同一个promise
上被多次调用。- 当
promise
被实现,所有相应的onFulfilled
回调必须按照它们对then
的调用顺序执行。 - 当
promise
被拒绝时,所有相应的onRejected
回调必须按照它们对then
的发起调用的顺序执行。
- 当
then
必须返回一个promise
,promise2 = promise1.then(onFulfilled, onRejected)
- 如果
onFulfilled
或onRejected
返回值x,则运行Promise Resolution Procedure [[Resolve]](promise2, x)
。 - 如果
onFulfilled
或onRejected
抛出异常e,则promise2
必须以e为理由被拒绝。 - 如果
onFulfilled
不是一个函数并且promise1
已实现,则promise2
必须以与promise1
相同的值来实现。 - 如果
onRejected
不是函数并且promise1
被拒绝,则promise2
必须以与promise1
相同的原因被拒绝。
- 如果