对 node.js 中承诺的本机支持



当前版本的 Node.js 中是否有对承诺的本机支持?

Node.js 使用 V8 引擎。Chrome也使用这个JavaScript引擎,Chrome 32对承诺有原生支持。但我似乎无法得到在 Node.js 中(本地)工作的承诺。

我已经在Chrome 32中尝试了以下代码,它可以工作。

var promise = new Promise(function(resolve, reject) {
// do a thing, possibly async, then…
if ( 1===1 /* everything turned out fine */) {
resolve("Stuff worked!");
}
else {
reject(Error("It broke"));
}
});
promise.then(function( message ) {
console.log( message );
},
function( err ) {
console.log( err );
});

但是,当我在 Node.js 中尝试相同的代码时,我得到:

var promise = new Promise(function(resolve, reject) {
^
ReferenceError: Promise is not defined

这段代码来自优秀的教程:

http://www.html5rocks.com/en/tutorials/es6/promises/

虽然 Node.js 在稳定版0.12中添加了原生承诺。

但是由于内存泄漏问题,我建议使用bluebird来避免该问题。

  • https://github.com/promises-aplus/promises-spec/issues/179
  • https://github.com/tj/co/issues/180

老安瑟:

Node.js 自版本0.11.13起添加了原生承诺支持。

nvm install 0.11.12
nvm run 0.11.12
> Promise
ReferenceError: Promise is not defined
> console.log(process.versions.v8)
3.22.24.19
nvm install 0.11.13
nvm run 0.11.13
> Promise
[Function: Promise]
> console.log(process.versions.v8)
3.25.30

注意:Node.jsv0.11仍处于测试阶段,如果在生产中使用它,请小心。

我知道 OP 发表这篇文章已经有很长时间了,但我想更新那些仍然设法通过搜索找到这个问题的人。

Node.js 添加了对 Promise 的原生支持,因为它与 io.js 合并。这发生在 2015 年 9 月 8 日(根据 Node.js 官方网站上的篇新闻文章),Node v4.0.0 的第一个稳定版本。

版本 4 中添加了许多新的 ES6 功能,例如 Promises。您可以在此处阅读有关它们的更多信息。

编辑:值得注意的是,Bluebird's Promise的性能似乎比Promise的原生实现更好。

需要指出的是,这个问题的公认答案是使用一个 promise 库,该库在语法上与 Promises/A+ 规范定义的原生 JS promise 功能不同。

如果您希望 Node 尽可能模仿浏览器,那么您应该使用位于 https://github.com/jakearchibald/es6-promise 的es6-promise模块。

npm install es6-promise

var Promise = require("es6-promise").Promise

技术差异:

模块的一个关键区别在于构造函数:var foo = new Promise()在您的浏览器中无效,因为Promise构造函数需要一个函数来初始化,并且该函数将负责解析或拒绝该承诺。在node-promises模块中,承诺的所有用户都可以访问解析,这打破了承诺的封闭。

使用node-promises的示例

var foo = new Promise() 
// no encapsulation, now anyone you pass this promise to can resolve it with whatever they want.

使用es6-promises的示例

var foo = new Promise(function(resolve, reject) { resolve("foo") }) 
// encapsulation, no one is able to resolve this Promise but the originator of that Promise.

如果您希望能够公开公开解决/拒绝功能,则需要展开承诺,请在此处举例说明。

如果节点使用的是与 Chrome 32 使用的相同或更高版本的 V8,则它可能受到本机支持。否则,您将需要加载"es6-shim"(我建议先加载es5-shim)我不知道当前版本的节点使用的是哪个版本的V8。

在我的节点上安装

node --version
v0.10.24
node -e 'console.log(process.versions.v8);'
3.14.5.9

Chrome V32 使用的是哪个版本?(我使用的是 Chromium v27),所以必须找到文档,但可能是 3.22.24.16

查看chrome://version/似乎提供了信息

Chromium    27.0.1453.93 (Developer Build 200836) Built from source for Fedora release 19 (Schrödinger’s Cat)
OS  Linux 
WebKit  537.36 (Unknown URL@0)
JavaScript  V8 3.17.6.14
Flash   11.2 r202
User Agent  Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36
Command Line     /usr/lib64/chromium-browser/chromium-browser --enable-plugins --enable-extensions --enable-user-scripts --enable-printing --enable-sync --auto-ssl-client-auth --flag-switches-begin --enable-sync-favicons --enable-full-history-sync --sync-keystore-encryption --flag-switches-end
Executable Path /usr/lib64/chromium-browser/chromium-browser
Profile Path    /home/graham/.config/chromium/Profile 1
Variations  b03ddc1f-2d9ef0cc
f9b252d0-fd526c81
ff3fc1a6-766fa2d
7f6da4bf-70d6abf1
75f7fb7e-611a9f49
262f996f-42d3ce07
24dca50e-455c9cca
ca65a9fe-91ac3782
3028188e-626278e
5e29d81-cf4f6ead
246fb659-6754d7b7
f296190c-72d8285f
4442aae2-4ad60575
75f0f0a0-a5822863
e2b18481-6e3b1976
e7e71889-e1cc0f14

现在从 Chrome 安装

Google Chrome   32.0.1700.107 (Official Build 248368) 
OS  Linux 
Blink   537.36 (@165586)
JavaScript  V8 3.22.24.17
Flash   12.0.0.44
User Agent  Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36
Command Line     /usr/bin/google-chrome-stable --flag-switches-begin --flag-switches-end
Executable Path /opt/google/chrome/google-chrome
Profile Path    /home/graham/.config/google-chrome/Default
Variations  b178bdde-887f97ea
24dca50e-837c4893
8d790604-9cb2a91c
5a3c10b5-e1cc0f14
244ca1ac-4ad60575
5e29d81-cf4f6ead
3ac60855-486e2a9c
246fb659-bd104136
f296190c-38939ee9
4442aae2-6e597ede
ed1d377-e1cc0f14
75f0f0a0-e1cc0f14
e2b18481-6e597ede
e7e71889-4ad60575

我尝试使用 --harmony 标志使用 Node v0.11.12,它没有本机承诺。

v0.11.13 及更高版本带有 --harmony 标志确实有承诺。

您需要拥有最新的 V8 版本 - 尝试从 master 分支编译 - 在那里你会发现带有承诺的 V8 版本 3.25.30

与标准 Q 的快速比较:

Q>resolve>then 100k times:
real    0m7.459s
user    0m7.121s
sys     0m0.346s
V8 Promose>resolve>then 100k times:
real    0m0.980s
user    0m0.884s
sys     0m0.097s

看起来 v0.12 支持承诺,请参阅节点。承诺。

尽管承诺本身不在节点中.js(尚未)。node.js的IO.js分支本身就拥有它们。看: http://davidwalsh.name/es6-io

最新更新