web-dev-qa-db-fra.com

Prise en charge native des promesses dans Node.js

Existe-t-il un support natif pour les promesses dans les versions actuelles de Node.js?

Node.js utilise le moteur V8. Ce moteur JavaScript est également utilisé par Chrome. Chrome 32 prend en charge les promesses en natif. Cependant, je ne peux pas sembler obtenir de promesses de fonctionner (de manière native) dans Node.js.

J'ai essayé le code suivant dans Chrome 32 et cela fonctionne.

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 );
});

Cependant, lorsque j'essaie ce même code dans Node.js, je reçois:

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

Ce code provient de l'excellent tutoriel:

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

75
Carl Parker

Si node utilise la même version ou une version plus récente de la V8 utilisée par Chrome 32, il est probablement pris en charge en mode natif. Sinon, vous devrez charger 'es6-shim' ( Je recommande le chargement es5-shim d'abord) Je ne sais pas quelle version de V8 utilise la version actuelle du noeud.

Sur mon noeud installer

node --version
v0.10.24

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

Quelle version est Chrome utilise V32? (J'utilise Chromium v27), il faudrait donc trouver de la documentation, mais peut-être même 3.22.24.16

Regarder dans chrome://version/ semble donner l'information

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

Et maintenant, à partir de Chrome install

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
23
Xotic750

Bien que Node.js ait ajouté une promesse native dans la version stable 0.12.

Mais en raison du problème de fuite de mémoire, je recommande d'utiliser bluebird pour éviter le problème.


Réponse ancienne:

Node.js a ajouté le support de promesse native depuis la version 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

Remarque: Node.js v0.11 est toujours en version bêta, soyez prudent si vous l’utilisez en production.

56
Chris

Je sais que cela fait longtemps que OP n'a pas publié ce message, mais je voulais mettre à jour ceux qui parviennent encore à trouver cette question grâce à la recherche.

Node.js a ajouté la prise en charge native de Promises depuis sa fusion avec io.js. Cela s'est passé le 8 septembre 2015 (d'après this poste publié sur le site officiel de Node.js) avec la première écurie. publication de Node v4.0.0.

Une foule de nouvelles fonctionnalités ES6, telles que Promises, ont été ajoutées à la version 4. Vous pouvez en savoir plus à leur sujet ici.

EDIT: A noter, il semble que Promise de Bluebird fonctionne mieux que l’implémentation native de Promise .

42
youngrrrr

Il est important de souligner que la réponse acceptée à cette question utilise une bibliothèque de promesses dont la syntaxe n'est pas identique à la fonctionnalité de promesse JS native définie par Promises/A + spec.

Si vous voulez Node) imiter le plus fidèlement possible le navigateur, vous devez utiliser le module es6-promise Situé à l'adresse https: //github.com/jakearchibald./es6-promise .

npm install es6-promise

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

Différences techniques:

Une différence essentielle dans le module réside dans le constructeur même: var foo = new Promise() n'est pas valide dans votre navigateur, car le constructeur Promise nécessite une fonction pour s'initialiser et cette fonction sera chargée de la résolution ou de la résolution. rejeter cette promesse. Dans le module node-promises, La résolution est accessible à tous les utilisateurs de la promesse, ce qui casse l'encapsulage de la promesse.

Exemple utilisant node-promises

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

Exemple utilisant 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.

Si vous souhaitez pouvoir exposer publiquement les capacités de résolution/rejet, vous devez déplier la promesse, par exemple ici .

39
Nucleon

J'ai essayé Node v0.11.12 avec le drapeau --harmony, et il n'a pas de promesse native.

v0.11.13 et versions ultérieures avec le drapeau --harmony ont Promise.

6
llambda

vous aurez besoin de la version la plus récente de V8 - essayez de compiler à partir de la branche principale - vous y trouverez la version V8 3.25.30 avec Promises

comparaison rapide avec Q standard:

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
witek

Il semble que la v0.12 prenne en charge les promesses, voir node.Promise .

3
Lonnie Best

Bien que les promesses ne soient pas nativement dans node.js (pour le moment). Le IO.js fork de node.js les a en natif. Voir: http://davidwalsh.name/es6-io

0
Lonnie Best