关于承诺/ A +规范,术语“可接受”和“承诺”之间有什么区别?

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

关于第1部分术语,

1.1。 "promise”是一个对象或函数,其行为符合此规范的then方法。

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

那么术语"thenable""promise"之间有什么区别?

也在2.3节。 承诺解决程序,

承诺解决程序是一个抽象的操作,将input的承诺和价值作为input,我们表示为[[Resolve]](promise, x)

所以我的问题是:

为什么在2个左右括号内表示? 有什么约定吗?

非常感谢你。

那么术语“可接受”和“承诺”之间有什么区别?

我认为你已经引用的部分确实很好地回答了这个问题:

  • thenable是一个具有then方法的对象。 任何对象。
  • 一个承诺是一个符合规范then方法(即一个thenable)的对象。

到目前为止这么简单。 我认为你的实际问题是:“ 他们为什么杰出?

问题是,通过查看一个对象,你不能决定是否是一个承诺。
可能会知道这是一个承诺,因为你可以看到它的方法是由你自己或你信任的人实现的 – 通常是你select的承诺库。 你将能够“看到”,因为该对象是从你的承诺原型inheritance的,或者你甚至可以比较你所定义的函数(参考)相同的方法。 或者任何其他检测方法对您来说都是足够的。
可能会说,这不是一个承诺,因为它没有方法。
但是,你如何处理一个实现的对象,但不知道是一个承诺? 这是一个可以接受的 ,并且会被这样处理。

Promises / A +规范旨在实现promise之间的互操作性,并使用.then()方法存在鸭子input 。 它确实指定了一个确切的algorithm来处理这样的可信( 可能是承诺或至less有类似的行为),以便您可以从它们创build一个实际的,可信的(“已知的”)承诺。

为什么在2个左右括号内表示? 有什么约定吗?

是的,ECMAScript规范将这个语法用于内部方法和属性 :

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

这些属性实际上并不需要存在,它们纯粹用来描述应该发生什么 – 一个实现必须像使用一样行事。 尽pipe它们完全是抽象的操作。

这是一个巧妙的尝试,可以使不同图书馆之间的承诺更容易互操作。

这个规范只是在几个地方使用这个术语。 这个是最重要的(empasis矿):

承诺解决程序是一个抽象的操作,将input的承诺和价值作为input,我们表示为[[Resolve]](promise, x)如果x是一个可接受的 ,它假设承诺采用x的状态,假设x的行为至less有点像一个承诺。 否则,它用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定义,实现者可以很容易地进行validation,做这个检查是微不足道的,并且使得实现可以thenable得更好。


对于第二个问题,我不确定,但是我的想法是,符号[[Resolve]](promise, x)强调这是一个抽象操作。 如果他们放弃了方括号,并且只是说Resolve(promise, x) ,那么它会暗示实现者应该创build一个名为Resolve的实际函数并将其公开。

这是不需要的 – Resolve不是承诺的接口的一部分; 这只是他们行为的一部分,足够重要,因为在文档中给出了一个名称和一个单独的部分。