JavaScript ES6 promise 和 Promise/A+ 完全一样吗?

nop*_*ole 5 javascript es6-promise

我可以找到一些博客文章说 JavaScript ES6 的承诺是 Promise/A+,但是官方的 ES6 规范没有提到它,并且MDN 在最底部有一个指向 Promise/A+ 的链接,但没有说明 ES6 JavaScript 的承诺与 Promise/A+ 完全相同。

有时它被表述为“ES6 promise基于Promise/A+”,但它们完全一样吗?(是否在官方文档中提及,例如来自 ECMA 或 MDN?)

T.J*_*der 5

它们并不相同,但 JavaScript 的承诺完全符合 Promises/A+ 规范。

Promises/A+ 是有意的极简主义。JavaScript 的 Promise 具有 Promises/A+ 规范未涵盖的实用功能(例如catch和finally)。不过,这些仅使用 Promises/A+ 涵盖的功能实现。例如,通过调用catch和finally实现then。(字面意思,而不仅仅是概念上。)例如,如果您查看规范catch,它catch的字面意思是这样的:

class Promise {
    // ...

    catch(onRejected) {
        return this.then(undefined, onRejected);
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

(finally有点复杂,但它最终也会调用then并返回它创建的承诺。)

JavaScript 的承诺也有偶尔的优化,只有在使用原生承诺(而不是来自第三方库的承诺)时才有效,但同样,它们完全符合 Promises/A+。