Javascript 关于承诺/A+;规范中,术语之间的区别是什么;“表格”;及;承诺;?
我正在查看“承诺/A+”规范,但无法理解以下内容: 关于第1节。术语 1.1<代码>“承诺”是一个对象或函数,其行为符合本规范的then方法 1.2.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) 所以我的问题是: 为什么在两个开始和结束括号内表示?是否有任何约定 非常感谢。这是一次明智的尝试,旨在使不同库之间的互
“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