ES5 与 ES6 承诺

Posted

技术标签:

【中文标题】ES5 与 ES6 承诺【英文标题】:ES5 vs ES6 Promises 【发布时间】:2016-11-20 08:10:45 【问题描述】:

我想知道 JS 承诺是否是 ES5 的一部分?如果是这样,为什么它有时在旧浏览器中不起作用,我们必须为它们添加一个 polyfill。另外,在这种情况下应该添加哪个 polyfill,一个 ES5 还是 ES6?我对此有点困惑。

【问题讨论】:

ES5 没有承诺。像 jQuery 或 Angular 这样的库有自己专有的 Promise 实现。 ES5 没有承诺作为语言的一部分。对于 ES5,promise 只是一种设计模式。 ES5 中确实有许多库实现了许多不同类型的 Promise。您甚至可以自己实现它们,因为它只是一种设计模式。 @slebetman 你能为我提供任何简单的承诺实现示例吗? @ParamSingh - 我的回答中已经有两个用于 ES5 的 promise 库。 【参考方案1】:

ES5 没有承诺。 jQuery 或 Angular 等库有自己的自定义和非标准 Promise 实现。

用于 ES5 的流行 Promise 实现是 Bluebird(与 ES6 标准兼容)和 Q(最初与 ES6 标准不兼容——尽管似乎正在朝着这个方向发展)和 RSVP。

两者都不是真正的 polyfill,因为它们添加了额外的功能,因此如果存在原生 Promise,它们不会妨碍它们。

有一些用于 ES6 Promise 的纯 polyfill。这是 RSVP 的一个子集:https://github.com/stefanpenner/es6-promise。

你可以在这里阅读更多的 polyfill 的理由:Are there still reasons to use promise libraries like Q or BlueBird now that we have ES6 promises?

在 Stack Overflow 上请求特定 polyfill 库的推荐被认为是题外话,所以我不会对此发表评论。

【讨论】:

@KirillSlatin - 我已经改成了“自定义和非标准”,尽管我宁愿把精力花在有意义的内容上,而不是写一些不会让任何人感到困惑的东西。 @jfriend00 其实codepen有一个标题“ES5 Promises”这让我想知道es5是否也有promises! @ParamSingh 见 ***.com/questions/23772801/… , ***.com/questions/36192728/… @ParamSingh - ES5,标准,不包括承诺。我们已经说过了。很长一段时间以来,浏览器已经超越了 ES5 并实现了 ES6 的部分内容,包括 Promise。但是,严格的 ES5 实现没有承诺,并且它们无论如何都不是 ES5 标准的一部分。它们被添加到 ES6 的标准中。有一个单独的 Promises/A+ 标准只定义了比 ES6 存在时间更长的 Promise。 @ParamSingh - Promises/A+ 定义了 .then() 处理程序的行为,承诺是整体承诺标准的一个元素。 ES6 在他们的规范中加入了 Promise 定义的这一部分。

以上是关于ES5 与 ES6 承诺的主要内容,如果未能解决你的问题,请参考以下文章

向 ES6 添加 Promise polyfill

类函数中的 Javascript ES6 承诺

es6 承诺吞下类型错误

有没有办法判断 ES6 承诺是不是被履行/拒绝/解决? [复制]

html ES6承诺

原生 ES6 承诺中 Bluebird Promise.finally 的等价物是啥? [复制]