Javascript 关于承诺/A+;规范中,术语之间的区别是什么;“表格”;及;承诺;?

Javascript 关于承诺/A+;规范中,术语之间的区别是什么;“表格”;及;承诺;?,javascript,promise,specifications,specification-pattern,Javascript,Promise,Specifications,Specification Pattern,我正在查看“承诺/A+”规范,但无法理解以下内容: 关于第1节。术语 1.1“承诺”是一个对象或函数,其行为符合本规范的then方法 1.2.“thenable”是定义then方法的对象或函数 那么术语“表”和“承诺”之间有什么区别呢 同样在第2.3节“承诺解决程序”中 承诺解析过程是一个抽象操作,输入一个承诺和一个值,我们将其表示为[[Resolve]](promise,x) 所以我的问题是: 为什么在两个开始和结束括号内表示?是否有任何约定 非常感谢。这是一次明智的尝试,旨在使不同库之间的互

我正在查看“承诺/A+”规范,但无法理解以下内容:

关于第1节。术语

1.1<代码>“承诺”是一个对象或函数,其行为符合本规范的then方法

1.2.
“thenable”
是定义then方法的对象或函数

那么术语
“表”
“承诺”
之间有什么区别呢

同样在第2.3节“承诺解决程序”中

承诺解析过程是一个抽象操作,输入一个承诺和一个值,我们将其表示为
[[Resolve]](promise,x)

所以我的问题是:

为什么在两个开始和结束括号内表示?是否有任何约定


非常感谢。

这是一次明智的尝试,旨在使不同库之间的互操作更加容易

规范仅在少数地方使用了术语
表格
。这是最重要的一个(empasis mine):

承诺解析过程是以承诺和值作为输入的抽象操作,我们将其表示为
[[Resolve]](承诺,x)
如果x是一个表,它会尝试使promise采用x的状态,假设x的行为至少有点像promise。否则,它会使用值x来履行promise

这将使实施者进行如下检查:

if (typeof(x.then) === 'function') {
    // adopt the state of x
} else {
    // fulfill promise with value x
}
如果规范改为“如果x是一个承诺,那么…”,那么实现者如何知道
x
是否是一个承诺?仅仅通过检查
x
没有实际的方法来确保它是否符合承诺规范

实现者(比如,库
foo
可能会执行以下操作

if (x instanceof FooPromises.Promise) {
    // adopt the state of x
} else {
    // fulfill promise with value x
}
它将有效地拒绝来自不同实现的任何承诺

相反,通过在实现者可以轻松验证的情况下使用超级简单的
表定义,进行此检查非常简单,而且实现之间可以友好相处


对于你的第二个问题,我不确定,但我的想法是一个符号
[[Resolve]](promise,x)
强调这是一个抽象操作。如果他们去掉括号,只说
Resolve(promise,x)
,它会以某种方式暗示实现者应该创建一个名为
Resolve
的真正函数并公开它

这是不需要的-
Resolve
不是承诺界面的一部分;它只是承诺行为的一部分,非常重要,在文档中有一个名称和单独的部分

那么,“可承诺”和“承诺”之间有什么区别呢

我认为你刚才提到的那一节很好地回答了这个问题:

  • thenable是具有
    then
    方法的对象。任何对象
  • 承诺是具有符合规范的
    then
    方法(即一个表)的对象
到目前为止,问题很简单。我认为你的实际问题是:“为什么它们与众不同?”

问题是,通过观察一个对象,你无法确定它是否是一个承诺。
您可能能够分辨出它是一个承诺,因为您可以看到它的
then
方法是由您自己或您信任的人实现的——通常是您选择的承诺库。您可以“看到”这一点,因为对象确实继承自您的承诺原型,或者您甚至可以比较正在使用的方法(引用)与您定义的功能相同。或任何其他适合您的检查方法。
您可能知道这不是承诺,因为它没有
then
方法。
但是,对于一个实现了
然后
,但又不知道是承诺的对象,您该怎么办呢?它是一个thenable,并且将被这样处理

Promises/A+规范旨在实现promise实现之间的互操作性,并使用存在的
.then()
方法。它确实指定了如何处理此类数据(可能是Promises,或至少具有类似行为)的精确算法,以便您可以创建实际的、可信的(“已知”)他们的承诺

为什么在两个开始和结束括号内表示?是否有任何约定

是的,ECMAScript规范使用以下语法:

内部属性的名称用双方括号[]括起来


这些属性实际上并不需要存在,它们只是用来描述应该发生的事情——一个实现必须像它使用它们一样工作。但是它们完全是抽象操作。

那么,表和承诺之间有什么区别呢?你如何定义区别?如果我创建一个对象
var foo={'then':function(){alert(123)};
,那么它是一个thenable,但显然不是一个承诺。谢谢你的澄清。所以thenable就是任何有“then”的东西"函数和承诺是一种特殊的表,据我所知,它符合规范。你知道为什么用两个括号来表示承诺解析过程吗?它们是表示函数还是回调?它遵循什么约定?谢谢。它们表示规范的一部分,而不是Javas特定于脚本。括号的存在使得
Resolve
与函数或回调不相似。回答得很好。最好能展示规范中的示例,说明一个表有多不可信-规范防止getter、抛出的表、吸收抛出的表的表等等。我没有从Promis中找到EA+规定了
的要求,然后
表格方法。如果必须返回pr