-->

关于承诺/ A +规格,是什么词之间“thenable”和“承诺”有什么区别?关于承诺/ A +规格

2019-05-10 12:08发布

我检查出的“承诺/ A +”规格,但不明白以下几点:

在第1节术语,

1.1。 "promise”是一个对象或功能与那么方法,其行为符合本说明书中。

1.2。 “thenable”是定义然后方法的对象或功能。

那么究竟是什么条件之间的区别"thenable""promise"

另外,在第2.3节。 无极解决程序,

许解决过程是一个抽象的操作作为输入一个承诺和一个值,它表示我们如[[Resolve]](promise, x)

所以我的问题是:

为什么在2个闭括号表示? 有什么约定?

非常感谢你。

Answer 1:

那么究竟是什么术语之间的“thenable”和“承诺”有什么区别?

我想你已经提到的部分不回答这个问题非常好:

  • 甲thenable是与一个对象then方法。 任何对象。
  • 甲诺是与一个对象then 符合所述规范方法(即,thenable)。

到目前为止那么简单。 我认为您的实际问题是:“他们为什么要区分

问题是,通过观察一个对象,你不能确定它是否是一个承诺。
也许可以告诉,这是一个承诺,因为你可以看到,其then的方法是通过你自己或你信任的人来实现-你选择的承诺库一般。 您将能够“看到”,由于对象不会从你的诺言原型继承,或者你甚至可以比较的方法是(指涉)等同于你所定义的功能。 或任何其他检查方法足以给你的。
也许可以告诉大家,这不是一个承诺,因为它没有then方法。
但是,你有什么用实现物体做then ,但不知道是一个承诺? 这是一个thenable,并会这样处理。

的承诺/ A +规范的目的是为实现承诺之间的互操作性,并且使用的存在.then()用于方法鸭打字 。 它指定有关如何看待这样的thenables精确算法( 可能是承诺,或者至少也有类似的行为),这样就可以创建一个实际的,值得信赖的(“已知”),从他们的诺言。

为什么在2个闭括号表示? 有什么约定?

是的,ECMAScript的规范使用此语法内部的方法和属性 :

内部属性的名称被包括在双方括号[[]]。

这些特性实际上并不需要存在的,他们纯粹是用来描述应该发生什么- 因为它使用了他们的实现必须采取行动。 他们是完全抽象的操作虽然。



Answer 2:

这是一个聪明的尝试,使其更容易对承诺是不同的库之间的互操作。

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

许解决过程是一个抽象的操作作为输入一个承诺和一个值,它表示我们如[[Resolve]](promise, x) 如果x是一个thenable,它试图使承诺采取x的状态,即X的行为至少有点像承诺的假设下。 否则,它满足X值的承诺。

这将使执行者做这样的检查:

if (typeof(x.then) === 'function') {
    // adopt the state of x
} else {
    // fulfill promise with value x
}

如果规范,而不是说:“如果x是一个承诺,那么......”,怎么会实现者知道x是一个承诺或不? 还有,以确保如果没有切实可行的办法x刚刚通过检查其与无极规范的规定。

实现者(比如,图书馆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不是用界面的一部分; 这只是他们的行为,这是足够重要的是,它被赋予一个名称,在文档中单独的一节的一部分。



文章来源: Regarding Promises/A+ Specification, what is the difference between the terms “thenable” and “promise”?