定义
一个健全的、可互操作的由开发者实现、并服务于开发者的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相同的原因被拒绝。
- 如果