这是一个聪明的尝试,可以让 Promise 在不同的库之间更容易互操作。
规范thenable
仅在几个地方使用了该术语。这是最重要的(empasis 我的):
Promise解析过程是一个抽象操作,将Promise和值作为输入,我们将其表示为[[Resolve]](promise, x)
。如果 x 是一个 thenable,它会尝试让 promise 采用 x 的状态,假设 x 的行为至少有点像 promise。否则,它以值 x 履行Promise。
这将使实现者进行如下检查:
if (typeof(x.then) === 'function') {
// adopt the state of x
} else {
// fulfill promise with value x
}
如果规范改为说“如果 x 是一个Promise,那么...”,实现者如何知道是否x
是一个Promise?没有切实可行的方法来确保x
仅通过检查它是否符合 Promise 规范。
一个实现者(比如,库FooPromises
可能会做类似的事情
if (x instanceof FooPromises.Promise) {
// adopt the state of x
} else {
// fulfill promise with value x
}
它会有效地拒绝来自不同实现的任何Promise。
相反,通过thenable
在这种情况下使用实现者可以轻松验证的超简单定义,进行此检查是微不足道的,并且您可以使实现相互配合。
对于你的第二个问题,我不确定,但我的想法是一个符号[[Resolve]](promise, x)
强调它是一个抽象操作。如果他们去掉括号而只说Resolve(promise, x)
,这会以某种方式暗示实现者应该创建一个真正的函数命名Resolve
并公开它。
这不是必需的 -Resolve
不是Promise界面的一部分;这只是他们行为的一部分,非常重要,以至于在文档中给了它一个名称和一个单独的部分。