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