承诺/A+
实现者对实现者的声音、可互操作JavaScript承诺的开放标准。
A类承诺表示异步操作的最终结果。与承诺互动的主要方式是通过其然后
方法,该方法注册回调以接收承诺的最终值或无法实现承诺的原因。
本规范详细说明了然后
方法,提供了一个可互操作的基础,所有符合Promises/A+的promise实现都可以依赖它来提供。因此,该规范应被视为非常稳定。尽管Promises/A+组织可能偶尔会修改此规范,并对其进行微小的后向兼容更改,以解决新发现的拐角情况,但只有在仔细考虑、讨论和测试后,我们才会集成大型或后向兼容的更改。
历史上,Promises/A+澄清了早期的行为条款承诺/A提案,将其延伸至覆盖范围事实上的行为和省略未指定或有问题的部分。
最后,核心Promises/A+规范没有处理如何创建、实现或拒绝承诺,而是选择专注于提供互操作性然后
方法。相关规范的未来工作可能涉及这些主题。
术语
- “promise”是带有
然后
其行为符合此规范的方法。
- “theable”是一个对象或函数,用于定义
然后
方法。
- “value”是任何合法的JavaScript值(包括
未定义
、一份表格或一份承诺)。
- “exception”是使用
扔
声明。
- “reason”是一个值,表示拒绝承诺的原因。
要求
承诺国
承诺必须处于三种状态之一:待定、履行或拒绝。
- 等待时,承诺:
- 可以转换为已完成或已拒绝状态。
- 履行承诺后:
- 不得过渡到任何其他状态。
- 必须具有一个值,该值不得更改。
- 当被拒绝时,承诺:
- 不得过渡到任何其他状态。
- 必须有一个不可改变的理由。
这里,“不得更改”意味着不可变的身份(即。===
),但并不意味着深度不变性。
这个然后
方法
承诺必须提供然后
方法来访问其当前或最终值或原因。
一个承诺然后
方法接受两个参数:
- 两者都有
已完成
和on拒绝
是可选参数:
- 如果
已完成
不是函数,必须忽略。
- 如果
on拒绝
不是函数,必须忽略。
- 如果
已完成
是一个函数:
- 必须在之后调用
承诺
满足,具有承诺
的值作为其第一个参数。
- 之前不能调用
承诺
已实现。
- 不能多次调用。
- 如果
on拒绝
是一个函数,
- 必须在之后调用
承诺
被拒绝承诺
的理由作为第一个论据。
- 之前不能调用
承诺
被拒绝。
- 不能多次调用。
已完成
或on拒绝
必须在执行上下文堆栈只包含平台代码。[3.1].
已完成
和on拒绝
必须作为函数调用(即没有这
值)。[3.2]
然后
同一个承诺可能会被多次调用。
- 如果/何时
承诺
均已完成已完成
回调必须按照其发起调用的顺序执行然后
.
- 如果/何时
承诺
均被拒绝on拒绝
回调必须按照其发起调用的顺序执行然后
.
-
然后
必须归还承诺[3.3].
- 如果有
已完成
或on已拒绝
返回一个值x个
,运行承诺解决过程[[解决]](promise2,x)
.
- 如果有
已完成
或on拒绝
引发异常e(电子)
,承诺2
必须拒绝e(电子)
作为原因。
- 如果
已完成
不是函数,并且承诺1
满足,承诺2
必须使用与承诺1
.
- 如果
on拒绝
不是函数,并且承诺1
被拒绝,承诺2
必须以相同的理由拒绝承诺1
.
承诺解决程序
这个承诺解决程序是一个抽象操作,将promise和value作为输入,我们将其表示为[[解决]](承诺,x)
.如果x个
是一种能力,它试图承诺
采取…的状态x个
,假设x个
行为至少有点像承诺。否则,它就满足了承诺
具有值x个
.
对表的这种处理允许promise实现进行互操作,只要它们公开符合Promises/a+的然后
方法。它还允许Promises/A+实现用合理的然后
方法。
要运行[[解决]](承诺,x)
,执行以下步骤:
- 如果
承诺
和x个
引用同一对象,拒绝承诺
用一个类型错误
作为原因。
- 如果
x个
是一个承诺,接受它的状态[3.4]:
- 如果
x个
正在挂起,承诺
必须保持挂起状态,直到x个
满足或拒绝。
- 如果/何时
x个
满足,满足承诺
具有相同的值。
- 如果/何时
x个
被拒绝,拒绝承诺
出于同样的原因。
- 否则,如果
x个
是对象或函数,
- 让
然后
是x.然后
. [3.5]
- 如果检索属性
x.然后
导致引发异常e(电子)
,拒绝承诺
具有e(电子)
作为原因。
- 如果
然后
是一个函数,用调用它x个
作为这
,第一个参数解决Promise
、和第二个参数拒绝承诺
,其中:
- 如果/何时
解决Promise
使用值调用年
,运行[[解决]](承诺,y)
.
- 如果/何时
拒绝承诺
是有原因的第页
,拒绝承诺
具有第页
.
- 如果两者都有
解决Promise
和拒绝承诺
调用,或多次调用同一参数,第一次调用优先,任何进一步的调用都将被忽略。
- 如果呼叫
然后
引发异常e(电子)
,
- 如果
解决Promise
或拒绝承诺
已被呼叫,忽略它。
- 否则,拒绝
承诺
具有e(电子)
作为原因。
- 如果
然后
不是函数,实现承诺
具有x个
.
- 如果
x个
不是对象或函数,实现承诺
具有x个
.
如果一个承诺是用一个参与循环表链的表来解决的,那么[[解决]](承诺,然后才能)
最终导致[[解决]](承诺,然后才能)
要再次调用,遵循上述算法将导致无限递归。鼓励但不要求实现检测此类递归并拒绝承诺
信息丰富类型错误
作为原因。[3.6]
笔记
-
这里的“平台代码”是指引擎、环境和承诺实现代码。在实践中,这一要求确保已完成
和on拒绝
异步执行,在事件循环之后然后
被调用,并具有新堆栈。这可以通过以下“宏观任务”机制来实现设置超时
或set立即
,或使用“微任务”机制,例如突变观察者
或进程.nextTick
由于承诺实现被视为平台代码,因此它本身可能包含一个任务调度队列或“蹦床”,在其中调用处理程序。
-
也就是说,在严格模式下这
将未定义
内部;在sloppy模式下,它将是全局对象。
-
实施可能允许promise2===承诺1
,前提是实现满足所有要求。每个实现都应该记录它是否可以生成promise2===承诺1
以及在什么条件下。
-
一般来说,我们只知道x个
如果它来自当前的实现,则是一个真正的承诺。本条款允许使用特定于实现的手段来采用已知一致承诺的状态。
-
首先存储对的引用的过程x.然后
,然后测试该引用,然后调用该引用,以避免多次访问x.然后
属性。这些预防措施对于确保访问器属性的一致性很重要,访问器属性值可能在检索之间发生变化。
-
实施应不对表链的深度设置任意限制,并假设超过该任意限制,递归将是无限的。只有真正的循环才能导致类型错误
;如果遇到由不同的表组成的无限链,则永远递归是正确的行为。
在法律允许的范围内,
承诺/A+组织已放弃所有版权和相关或相邻权利承诺/A+承诺规范.本作品发表于:美国.