本地支持Node.js中的承诺

在当前版本的Node.js中是否有对promise的本地支持?

Node.js使用V8引擎。 Chrome浏览器也使用这个JavaScript引擎,Chrome 32本身也支持Promise。 但我似乎无法承诺在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/

如果节点使用的是Chrome 32使用的相同或更高版本的V8,则可能本机支持。 否则,你将需要加载'es6-shim' (我build议首先加载es5-shim )我不知道当前版本的V8版本正在使用哪个版本。

在我的节点上安装

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

Chrome V32使用的是什么版本? (我使用Chromium v​​27),所以必须find文档,但可能是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 

尽pipeNode.js在稳定版本0.12添加了本地承诺。

但由于内存泄漏问题,我build议使用bluebird来避免这个问题。


老安泽尔:

0.11.13版本0.11.13 Node.js添加了本地承诺支持。

 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.js v0.11还处于testing阶段,如果在生产环境中使用,请小心。

需要指出的是,这个问题所接受的答案是使用承诺库,它在语义上与Promises / A +规范定义的原生JS承诺function不相同。

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

npm install es6-promise

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

技术差异:

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

使用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. 

如果您希望公开揭露解决/拒绝function,您需要展开承诺,例如这里 。

我知道OP发表这篇文章已经有相当长的一段时间了,但是我想通过search来更新那些仍在努力寻找这个问题的人。

自从与io.js合并后,Node.js添加了对Promises的原生支持。 这发生在2015年9月8日(根据官方Node.js站点上的这个新闻),第一个稳定版本的Node v4.0.0。

许多新的ES6function(如Promise)已添加到版本4.您可以在这里阅读更多关于它们的信息

编辑:值得注意的是, 似乎Bluebird的Promise比Promise的本地执行更好 。

我用–harmony标志尝试了Node v0.11.12,它没有本地的promise。

v0.11.13及以后的和谐旗子确实有Promise。

你将需要有最新的V8版本 – 尝试编译从主分支 – 那里你会发现V8版本3.25.30承诺

与标准快速比较问:

 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支持promise,看node.Promise。

尽pipe承诺并不在native.js(尚)。 node.js的IO.js分支具有它们的本地特性。 请参阅: http : //davidwalsh.name/es6-io