关于javascript:关于Promise / A Specification,术语” thenable”和” promise”有什么区别?

Regarding Promises/A+ Specification, what is the difference between the terms “thenable” and “promise”?

我正在检查" Promises / A "规范,但不了解以下内容:

关于第1节。术语,

1.1。 "promisea€?是具有then方法的对象或函数,其行为符合此规范。

1.2。 a€?thenablea€?是定义then方法的对象或函数。

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

也在第2.3节中。Promise解决程序,

promise解析过程是一个抽象操作,将一个promise和一个值作为输入,我们将其表示为[[Resolve]](promise, x)

所以我的问题是:

为什么在两个左括号和右括号中表示它?有约定吗?

非常感谢您。


So What is the difference between the terms"thenable" and"promise"?

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

  • thenable是具有then方法的对象。任何物体。
  • 许诺是具有符合规范的then方法(即thenable)的对象。

到目前为止非常简单。我认为您的实际问题是:"为什么要区分它们?"

问题在于,通过查看一个对象,您无法确定它是否是一个Promise。
您可能会说这是一个诺言,因为您可以看到它的then方法是由您自己或您信任的人实现的-通常是您选择的诺言库。您将能够"看到"该对象,因为该对象确实是从您的Promise原型继承的,或者甚至可以比较(引用地)与所定义函数完全相同的方法。或任何其他适合您的检查方法。
您可能可以说这不是一个Promise,因为它没有then方法。
但是,您如何处理实现then但未知的对象?这是可以处理的,因此将被处理。

Promises / A规范旨在实现Promise实现之间的互操作性,并使用.then()方法的存在来进行鸭子输入。它确实指定了一种有关如何处理此类ableable(可能是promise或至少具有类似行为)的精确算法,以便您可以从中创建实际的,可信的("已知")promise。

Why is it denoted within 2 opening and closing brackets? Is there any convention?

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

The names of internal properties are enclosed in double square brackets [[ ]].

这些属性实际上并不需要存在,它们只是用来描述应该发生的事情-实现必须像使用它们一样起作用。但是,它们完全是抽象操作。


这是一个明智的尝试,可以使Promise在不同库之间更易于互操作。

该规范仅在几个地方使用术语thenable。这是最重要的(矿井开采):

The promise resolution procedure is an abstract operation taking as input a promise and a value, which we denote as [[Resolve]](promise, x). If x is a thenable, it attempts to make promise adopt the state of x, under the assumption that x behaves at least somewhat like a promise. Otherwise, it fulfills promise with the value x.

这将使实现者进行如下检查:

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

如果规范改为说"如果x是一个诺言,那么...",那么实现者将如何知道x是否是一个诺言?仅通过检查,无法确定x是否符合Promise规范。

一个实现者(例如,库FooPromises可能会执行

1
2
3
4
5
if (x instanceof FooPromises.Promise) {
    // adopt the state of x
} else {
    // fulfill promise with value x
}

,它将有效地拒绝来自不同实现的任何Promise。

相反,通过在实现者可以轻松验证的这种情况下使用thenable的超简单定义,进行此检查很简单,并且使实现彼此之间可以很好地发挥作用成为可能。

对于第二个问题,我不确定,但是我的想法是符号[[Resolve]](promise, x)强调它是一个抽象操作。如果他们放括号并只说了Resolve(promise, x),则将暗示执行者应该制作一个名为Resolve的真实函数并将其公开。

这不是必需的-Resolve不是promises界面的一部分;仅仅是他们行为的一部分就足够重要了,因此在文档中给了它一个名称和一个单独的部分。