Встроенная поддержка обещаний в узле.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
этот код отличный учебник:
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