为什么我不能在node v0.11.11中使用Promise?

7

我正在玩弄node的v0.11分支,我想知道为什么即使打开了--harmony,我也不能使用原生的ES6 Promise对象。

我的普通chrome浏览器:

Google Chrome    32.0.1700.77 (Official Build 244503) 
JavaScript       V8 3.22.24.10

我的电脑上运行了node.js v0.11.11,它支持它们。

> process.versions.v8
'3.22.24.19'

所以问题出在哪里呢?

2
Chrome中的Promises是DOM Futures。此外,它们非常实验性,API可能会发生变化(目前正在进行大量讨论)。考虑使用Bluebird promise,因为它们更快,具有更好的堆栈跟踪和稳定性。 - Benjamin Gruenbaum
基本上因为它是一个DOM API而不是JavaScript API。 - mpm
1
@mpm,ES6 中确实有 Promise,只是它们还没有“解决” - Chrome 的开发人员也非常生气:http://esdiscuss.org/topic/promise-cast-and-promise-resolve#content-77 - Benjamin Gruenbaum
@BenjaminGruenbaum -- 好的,这解释了为什么 Node 没有它们,但是为什么它们被认为是 DOM 的一部分呢?我一直在使用 q,这并不是我想要找一个库的问题,只是好奇为什么它没有起作用。如果你回答了我的问题,我会接受它 :) - user578895
1个回答

10

本地Promise已经可以使用了。它们仍然比Bluebird等库慢且难以调试,但是它们已经存在。


Chrome中目前的Promise是DOM Futures。此外,它们非常实验性,并且API可能会更改(目前正在积极讨论中)。

考虑使用 Bluebird promise 代替,因为它们速度更快,具有更好的堆栈跟踪并且是稳定的。

它比像 Q 这样的库快得多(快两个数量级),具有更好的堆栈跟踪和完全符合规范的API。当然,您也可以自己编译node和v8 - v8本身就有 promises

在ES6中也有promise,只是它们还没有被“解决”- 这让Chrome人相当生气

它们也被认为是DOM的一部分,因为未来的DOM API将使用promise。


请注意:如果您自己编译Node和V8,请注意这些Promise包括有争议的方法,例如.chain(非解封then),可能会或可能不会成为标准。 - Benjamin Gruenbaum
谢谢你提供的信息 :) 你有关于Promises何时被纳入v8的参考资料吗? - user578895
@zyklus 事实上,目前关于它们存在相当大的争议。人们正在努力工作,但我认为这种情况在未来几个月内不会有所改变。我认为你最好选择像Bluebird这样的东西,它与本地代码一样快,并支持相同的API。 - Benjamin Gruenbaum
是的,我正在开始一个新项目。大致考虑将 bluebird polyfill 到 global.Promise 上,然后在 node v0.12 或者 Promise 被合并的时候将其移除。 - user578895
@zyklus 说实话 - Bluebird 可能仍然比原生 Promise 更快,消耗的内存更少 - 但是是的。如果你限制自己只使用标准方法,你可以轻松地将其替换掉 - 这个库已经广泛地针对标准进行了测试。 - Benjamin Gruenbaum
3
@zyklus,自2013年11月28日V8版本3.23.14起,ES6 promises已经被纳入其中。但是Node仍需跟进。 - Andreas Rossberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接