Встроенная поддержка Promises в Node.js
Есть ли встроенная поддержка promises в текущих версиях Node.js?
Node.js использует двигатель V8. Этот механизм JavaScript также используется Chrome, а Chrome 32 имеет встроенную поддержку promises. Но я не могу заставить promises работать (изначально) в 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
Этот код из отличного учебника:
http://www.html5rocks.com/en/tutorials/es6/promises/
Ответы
Ответ 1
Если node использует ту же самую или более позднюю версию V8, которую использует Chrome 32, то она, скорее всего, поддерживается. В противном случае вам нужно будет загрузить 'es6-shim' (рекомендую загрузить es5-shim) Я не знаю, какая версия V8 использует текущая версия node.
На моем 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 [email protected])
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
Ответ 2
Хотя Node.js добавило собственное обещание в стабильную версию 0.12
.
Но из-за проблемы с утечкой памяти я рекомендую использовать bluebird
, чтобы избежать проблемы.
Старый anwser:
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
все еще находится в состоянии бета-тестирования, будьте осторожны, если используете его в процессе производства.
Ответ 3
Важно отметить, что принятым ответом на этот вопрос является использование библиотеки обещаний, которая не является синтаксически идентичной функции нативного JS-обещания, как определено Promises/A +.
Если вы хотите Node, насколько это возможно, имитировать браузер, тогда вы должны использовать модуль 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
разрешение доступно для всех пользователей 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.
Если вы желаете публично раскрывать возможности разрешения/отклонения, вам нужно развернуть обещание, например здесь.
Ответ 4
Я знаю, что прошло довольно много времени с тех пор, как OP сделал это сообщение, но я хотел обновить те, которые все еще удается найти этот вопрос через поиск.
Node.js добавила встроенную поддержку для Promises, поскольку она объединилась с io.js. Это произошло 8 сентября 2015 года (согласно сообщению this на официальном сайте Node.js) с первый стабильный выпуск Node v4.0.0.
Множество новых функций ES6, таких как Promises, были добавлены с версией 4. Вы можете узнать больше о них здесь.
EDIT: примечание выглядит так, как будто Bluebird Promise работает лучше, чем встроенная реализация Promise.
Ответ 5
Я пробовал Node v0.11.12 с флагом --harmony, и у него нет встроенного promises.
v0.11.13 и более поздние с флагом -harmony имеет Promise.
Ответ 6
вам понадобится новая версия V8 - попробуйте выполнить компиляцию из главной ветки - там вы найдете версию 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
Ответ 7
Похоже, что v0.12 поддерживает promises, см. node.Promise.
Ответ 8
Хотя promises не изначально в node.js(пока). IO.js вилка node.js имеет их изначально. Видеть:
http://davidwalsh.name/es6-io