Native Unterstützung für Versprechen in Node.js.


76

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:

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


1
Die native Unterstützung in Node ist erst dann sehr nützlich, wenn alle Module sie verwenden. Versprich alles.
Rudie


6
@StevenLu: Das erste, was ich gelesen habe, nachdem ich auf Ihren Link geklickt habe: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!
Trevor

6
Bitte beachten Sie, dass Bluebirds Behauptung, die schnellste zu sein, nun Jahre alt ist. Die Geschwindigkeitsangaben waren im Wesentlichen nur ein Kurzschlussfall, und jedes Mal, wenn ich es persönlich getestet habe, war es eindeutig nicht die schnellste. Ich persönlich benutze when.js, weil es eine Reihe von Funktionen hat, die mir das Leben leichter gemacht haben, aber jedes Mal, wenn ich einen Leistungsvergleich durchgeführt habe, war es immer ein kleines bisschen schneller als Bluebird und Kew. Die einzige Bibliothek, die Sie als "langsam" bezeichnen können, ist Q und wurde seit 4 Jahren nicht mehr aktualisiert. Wenn Sie etwas für Geschwindigkeit wählen, testen Sie es zuerst selbst!
Andrew

Antworten:


23

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 geben

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

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

In der Windows (10) -Befehlszeile muss die Überprüfung der Knotenversion in doppelten Anführungszeichen erfolgen, dh Knoten -e "console.log (process.versions.v8)"
AndyS

55

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.11befindet sich noch in der Beta-Phase. Seien Sie vorsichtig, wenn Sie es in der Produktion verwenden.


2
Weiß jemand, ob der erwähnte Speicherverlust in Knoten 4/5 immer noch auftritt?
1nfiniti

1
Leider lautet die Antwort ja. Für weitere Informationen: github.com/nodejs/node/issues/4210 .
Chris

@ 1nfiniti nein, das von Chris verlinkte Problem ist jetzt geschlossen
Janus Troelsen

1
@JanusTroelsen gut "Schließen, da es derzeit kein umsetzbares Problem ist ." klingt nicht wie fest ...
LJ 6

1
@LJ ᛃ der neueste Kommentar sagt jetzt "das Update ist letztes Jahr in V8 Master gelandet, also denke ich, dass es jetzt schon in Node gelandet sein sollte"
Aur Saraf

43

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 .


39

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-promiseModul 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 .


Als ich Ihren Beitrag durchlas, entschied ich mich, es6-versprechen zu versuchen, hatte aber einige Probleme, als ich es6-versprechen s installierte , wie Sie es direkt vor dem letzten Codebeispiel nennen. Ich dachte, ich würde es erwähnen, falls jemand anderes das Gleiche tut.
Hansn

Diese Antwort ist jetzt veraltet
Janus Troelsen

Wie LJ erwähnte, wurde das Problem geschlossen, aber es sieht nicht so aus, als ob es behoben wurde. Ich glaube nicht, dass die Antwort veraltet ist
ABCD.ca

6

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.


3

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:

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

3

Es sieht so aus, als ob v0.12 Versprechen unterstützt, siehe node.Promise .


2
Ähm, das war v0. 1 .12 - ab 2011! Und diese "Versprechen" waren nach dem, was ich dort lesen kann, noch nicht einmal möglich.
Bergi

Verdammt! Ja, v0.1.12 gegenüber v0.12 macht einen großen Unterschied. Danke, dass du mich verbessert hast. Ist der Mangel an Versprechen ein Teil dessen, was den Aufstand von IO.j antreibt ? Ich, denn jetzt, ich nur verwenden Q .
Lonnie Best

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.