Gibt es native Unterstützung für Versprechen in aktuellen Versionen von Node.js?
Node.js verwendet die V8-Engine. Diese JavaScript-Engine wird auch von Chrome verwendet, und Chrome 32 bietet native Unterstützung für Versprechen. Aber ich kann anscheinend keine Versprechen bekommen, (nativ) in Node.js zu arbeiten.
Ich habe den folgenden Code in Chrome 32 ausprobiert und er funktioniert.
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 );
});
Wenn ich jedoch denselben Code in Node.js versuche, erhalte ich:
var promise = new Promise(function(resolve, reject) {
^
ReferenceError: Promise is not defined
Dieser Code stammt aus dem hervorragenden Tutorial:
javascript
node.js
promise
Carl Parker
quelle
quelle
BEWARE This article is old, it's 2013 old. Since then things have changed and a winner has prevailed, Bluebird is a Promises Library build with performance in mind and when actually tested with the benchmarks of this article it did even better than Async!
Antworten:
Wenn der Knoten dieselbe oder eine neuere Version von V8 verwendet, die Chrome 32 verwendet, wird dies wahrscheinlich nativ unterstützt. Andernfalls müssen Sie 'es6-shim' laden (ich empfehle, es5-shim zu laden ). Ich habe keine Ahnung, welche Version von V8 die aktuelle Version von Node verwendet.
Auf meinem Knoten installieren
node --version v0.10.24 node -e 'console.log(process.versions.v8);' 3.14.5.9
Welche Version verwendet Chrome V32? (Ich verwende Chromium v27), müsste also Dokumentation finden, aber möglicherweise 3.22.24.16
Ein Blick hinein
chrome://version/
scheint die Informationen zu gebenChromium 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
Und jetzt von einer Chrome-Installation
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
quelle
Obwohl Node.js ein natives Versprechen in einer stabilen Version hinzugefügt hat
0.12
.Aufgrund des Speicherverlustproblems empfehle ich jedoch
bluebird
, das Problem zu vermeiden.Alte Antwort:
Node.js hat seit der Version native Versprechen unterstützt
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
Hinweis: Node.js
v0.11
befindet sich noch in der Beta-Phase. Seien Sie vorsichtig, wenn Sie es in der Produktion verwenden.quelle
Ich weiß, dass es ziemlich lange her ist, seit OP diesen Beitrag verfasst hat, aber ich wollte diejenigen aktualisieren, die es noch schaffen, diese Frage durch Suche zu finden.
Node.js hat native Unterstützung für Promises hinzugefügt, da es mit io.js zusammengeführt wurde. Dies geschah am 8. September 2015 (gemäß diesem Nachrichtenbeitrag auf der offiziellen Node.js-Website) mit der ersten stabilen Version von Node v4.0.0.
Mit Version 4 wurden zahlreiche neue ES6-Funktionen wie Promises hinzugefügt. Weitere Informationen hierzu finden Sie hier .
BEARBEITEN: Bemerkenswert ist, dass Bluebirds Versprechen eine bessere Leistung erbringt als die native Implementierung von Versprechen .
quelle
Es ist wichtig darauf hinzuweisen, dass die akzeptierte Antwort auf diese Frage eine Versprechungsbibliothek verwendet, die syntaktisch nicht mit der nativen JS-Versprechungsfunktion identisch ist, wie sie in Promises / A + definiert ist -Spezifikation definiert ist.
Wenn Sie möchten, dass Node den Browser so genau wie möglich nachahmt, sollten Sie das
es6-promise
Modul unter https://github.com/jakearchibald/es6-promise verwenden .npm install es6-promise
var Promise = require("es6-promise").Promise
Technische Unterschiede:
Ein wesentlicher Unterschied im Modul liegt im Konstruktor:
var foo = new Promise()
ist in Ihrem Browser nicht gültig, da derPromise
Konstruktor eine Funktion zum Initialisieren benötigt und diese Funktion für das Auflösen oder Ablehnen dieses Versprechens verantwortlich ist. In demnode-promises
Modul ist die Auflösung für alle Benutzer des Versprechens zugänglich, wodurch die Verkapselung des Versprechens unterbrochen wird.Beispiel mit
node-promises
var foo = new Promise() // no encapsulation, now anyone you pass this promise to can resolve it with whatever they want.
Beispiel mit
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.
Wenn Sie die Möglichkeit haben möchten, die Auflösungs- / Ablehnungsfunktionen öffentlich zugänglich zu machen, müssen Sie das Versprechen entfalten, Beispiel hier .
quelle
Ich habe Node v0.11.12 mit dem Flag --harmony ausprobiert und es gibt keine nativen Versprechen.
v0.11.13 und höher mit dem Flag --harmony hat Promise.
quelle
Sie benötigen die neueste V8-Version - versuchen Sie, aus dem Hauptzweig zu kompilieren - dort finden Sie die V8-Version 3.25.30 mit Promises
schneller Vergleich mit Standard Q:
quelle
Es sieht so aus, als ob v0.12 Versprechen unterstützt, siehe node.Promise .
quelle
Obwohl Versprechen (noch) nicht nativ in node.js sind. Die IO.js- Gabel von node.js hat sie nativ. Siehe: http://davidwalsh.name/es6-io
quelle