Node.jsの現在のバージョンでプロミスのネイティブサポートはありますか?
Node.jsはV8エンジンを使用します。このJavaScriptエンジンはChromeでも使用され、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
このコードは、優れたチュートリアルからのものです。
ノードが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
Node.jsは、安定版0.12
にネイティブプロミスを追加しましたが。
ただし、メモリリークの問題のため、この問題を回避するために bluebird
を使用することをお勧めします。
古いアンカー:
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.js v0.11
はまだベータ版です。本番環境で使用する場合は注意してください。
OPがこの投稿を作成してからかなり長い時間が経ちましたが、検索を通じてこの質問を見つけようとしている人たちを更新したかったのです。
Node.jsはio.jsと統合されたため、Promisesのネイティブサポートを追加しました。これは2015年9月8日に発生しました(this公式Node.jsサイトのニュース投稿)、最初の安定版Node v4.0.0のリリース。
Promisesなどの新しいES6機能のホストがバージョン4で追加されました。それらについて詳しく読むことができますhere。
編集:注目すべきは、 BluebirdのPromiseがPromiseのネイティブ実装よりも優れているように見える です。
この質問に対して受け入れられている答えは、 Promises/A + 仕様で定義されているネイティブのJS promise機能と構文的に同一ではないpromiseライブラリを使用していることを指摘することが重要です。
Nodeを可能な限りブラウザに似せたい場合は、 https://github.com/jakearchibald/es6-promiseにあるes6-promise
モジュールを使用する必要があります。 。
npm install es6-promise
var Promise = require("es6-promise").Promise
技術的な違い:
モジュールの重要な違いの1つは、コンストラクターにあります。Promise
コンストラクターは初期化する関数を必要とし、その関数はその約束を解決または拒否するため、ブラウザーではvar foo = new Promise()
は無効です。 node-promises
モジュールでは、Promiseのすべてのユーザーが解決にアクセスできるため、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.
解決/拒否機能を公開する機能が必要な場合は、約束を展開する必要があります。例 here 。
--harmonyフラグを使用してNode v0.11.12を試しましたが、ネイティブの約束はありません。
--harmonyフラグを指定したv0.11.13以降にはPromiseがあります。
最新のV8バージョンが必要です-masterブランチからコンパイルしてみてください-V8バージョン3.25.30とPromisesがあります。
標準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はプロミスをサポートしているようです。 node.Promise を参照してください。
ただし、promiseはnode.jsにはまだありません(まだ)。 node.jsの IO.js フォークにはネイティブに含まれています。参照: http://davidwalsh.name/es6-io