我检查出的“承诺/ A +”规格,但不明白以下几点:
在第1节术语,
1.1。 "promise”
是一个对象或功能与那么方法,其行为符合本说明书中。
1.2。 “thenable”
是定义然后方法的对象或功能。
那么究竟是什么条件之间的区别"thenable"
和"promise"
?
另外,在第2.3节。 无极解决程序,
许解决过程是一个抽象的操作作为输入一个承诺和一个值,它表示我们如[[Resolve]](promise, x)
所以我的问题是:
为什么在2个闭括号表示? 有什么约定?
非常感谢你。
那么究竟是什么术语之间的“thenable”和“承诺”有什么区别?
我想你已经提到的部分不回答这个问题非常好:
- 甲thenable是与一个对象
then
方法。 任何对象。 - 甲诺是与一个对象
then
符合所述规范方法(即,thenable)。
到目前为止那么简单。 我认为您的实际问题是:“他们为什么要区分 ”
问题是,通过观察一个对象,你不能确定它是否是一个承诺。
你也许可以告诉,这是一个承诺,因为你可以看到,其then
的方法是通过你自己或你信任的人来实现-你选择的承诺库一般。 您将能够“看到”,由于对象不会从你的诺言原型继承,或者你甚至可以比较的方法是(指涉)等同于你所定义的功能。 或任何其他检查方法足以给你的。
你也许可以告诉大家,这不是一个承诺,因为它没有then
方法。
但是,你有什么用实现物体做then
,但不知道是一个承诺? 这是一个thenable,并会这样处理。
的承诺/ A +规范的目的是为实现承诺之间的互操作性,并且使用的存在.then()
用于方法鸭打字 。 它指定有关如何看待这样的thenables精确算法( 可能是承诺,或者至少也有类似的行为),这样就可以创建一个实际的,值得信赖的(“已知”),从他们的诺言。
为什么在2个闭括号表示? 有什么约定?
是的,ECMAScript的规范使用此语法内部的方法和属性 :
内部属性的名称被包括在双方括号[[]]。
这些特性实际上并不需要存在的,他们纯粹是用来描述应该发生什么- 因为它使用了他们的实现必须采取行动。 他们是完全抽象的操作虽然。
这是一个聪明的尝试,使其更容易对承诺是不同的库之间的互操作。
该规范使用术语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”?