Promise/A+

72 阅读3分钟

定义

一个健全的、可互操作的由开发者实现、并服务于开发者的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值(包括undefinedthenablepromise
  • "异常"是使用throw语句抛出的值
  • "reason" 是一个值,表示一个承诺被拒绝的原因

2. 要求

2.1 Promise 状态

Promise必须处于以下三种状态之一:待处理(pending)、已完成(fulfilled)或已拒绝(rejected)。

  • pending:
    • 可能转换到已经完成或已拒绝状态
  • fulfilled:
    • 不能过度到任何其他状态
    • 必须有一个不能改变的值
  • rejected:
    • 不能过度到任何其他状态
    • 必须有一个理由,这个理由不能改变

2.2 then方法

Promise必须提供then方法来访问其当前或最终的值或原因

Promisethen方法接受两个参数

promise.then(onFulfilled, onRejected)
  • onFulfilledonRejected都是可选参数:
    • 如果onFulfilled不是函数,则必须忽略它。
    • 如果onRejected不是函数,则必须忽略它。
  • 如果onFulfilled是一个函数:
    • 它必须在promise完成后调用,promise的值作为它的第一个参数。
    • promise完成之前不能调用它。
    • 不能多次调用它。
  • 如果onRejected是一个函数:
    • 它必须在promise被拒绝后调用,promise的原因是它的第一个参数。
    • promise被拒绝之前之前不能调用它。
    • 不能多次调用它。
  • 在执行上下文堆栈仅包含平台代码之前,不得调用onFulfilledonRejected
  • onFulfilledonRejected必须作为函数调用。
  • then可能会在同一个promise上被多次调用。
    • promise被实现,所有相应的onFulfilled回调必须按照它们对then的调用顺序执行。
    • promise被拒绝时,所有相应的onRejected回调必须按照它们对then的发起调用的顺序执行。
  • then必须返回一个promisepromise2 = promise1.then(onFulfilled, onRejected)
    • 如果onFulfilledonRejected返回值x,则运行Promise Resolution Procedure [[Resolve]](promise2, x)
    • 如果onFulfilledonRejected抛出异常e,则promise2必须以e为理由被拒绝。
    • 如果onFulfilled不是一个函数并且promise1已实现,则promise2必须以与promise1相同的值来实现。
    • 如果onRejected不是函数并且promise1被拒绝,则promise2必须以与promise1相同的原因被拒绝。