Встроенная поддержка обещаний в узле.js


есть ли встроенная поддержка обещаний в текущих версиях Node.Джей?

узел.js использует двигатель V8. Этот движок JavaScript также используется Chrome, и Chrome 32 имеет встроенную поддержку обещаний. Но я не могу получить обещания работать (изначально) в узле.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 );
});

однако, когда я пытаюсь этот же код в узле.Яш, я понимаю:

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

этот код отличный учебник:

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

8 73

8 ответов:

если node использует ту же или более позднюю версию V8, что и Chrome 32, то она, вероятно, поддерживается изначально. В противном случае вам нужно будет загрузить 'es6-shim' (Я рекомендую нагружать es5-shim во-первых) я понятия не имею, какую версию V8 использует текущий выпуск node.

на моем узле установить

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

Хотя Узел.js добавил родное обещание в стабильной версии 0.12.

но из-за проблемы утечки памяти, я рекомендую использовать bluebird чтобы избежать этой проблемы.


старый anwser:

узел.js добавил поддержку native promise с тех пор версия 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

Примечание: Узел.js v0.11 по-прежнему в бета-версии, будьте осторожны, если использовать его в производстве.

важно отметить, что принятый ответ на этот вопрос использует библиотеку promise, которая синтаксически не идентична родной функции JS promise, определенной Обещания/A+ spec.

если вы хотите, чтобы узел, как можно ближе, имитировать браузер, то вы должны использовать es6-promise модуль, расположенный по https://github.com/jakearchibald/es6-promise.

npm install es6-promise

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

Технические Различия:

одно ключевое отличие модуля заключается в самом конструкторе:var foo = new Promise() не действует в вашем браузере, как Promise конструктор требует, чтобы функция инициализировалась, и эта функция будет отвечать за разрешение или отклонение этого обещания. В node-promises модуль, разрешение доступно для всех пользователи обещания, которое нарушает encasuplation обещания.

пример использования 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.

если вы хотите иметь возможность публично раскрывать возможности разрешения / отклонения, вам нужно будет развернуть обещание, пример здесь.

Я знаю, что прошло довольно много времени с тех пор, как OP сделал этот пост, но я хотел обновить те, которые все еще удается найти этот вопрос через поиск.

узел.js добавил собственную поддержку обещаний, так как он слился с io.js. Это произошло 8 сентября 2015 года (согласно этой сообщение новостей на официальном узле.JS site) с первым стабильным выпуском узла v4.0.0.

множество новых функций ES6, таких как обещания, были добавлены с помощью версия 4. Вы можете прочитать больше о них здесь.

редактировать: обратите внимание, похоже, что обещание Bluebird работает лучше, чем собственная реализация обещания.

Я попробовал узел v0. 11.12 с флагом --harmony, и у него нет собственных обещаний.

версия v0.11.13 и позже с флагом --гармония есть обещание.

вам нужно будет иметь новейшую версию V8-попробуйте компиляцию из master branch-там вы найдете версию V8 3.25.30 с обещаниями

быстрое сравнение со стандартным 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 поддерживает обещания, см. узел.Обещай.

хотя обещания не являются изначально в узле.js (пока). Элемент IO.js вилки узла.JS имеет их изначально. Видеть: http://davidwalsh.name/es6-io