关于承诺/ 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
不是承诺的接口的一部分; 这只是他们行为的一部分,足够重要,因为在文档中给出了一个名称和一个单独的部分。