Program Tip

Node.js의 약속에 대한 기본 지원

programtip 2020. 10. 18. 19:00
반응형

Node.js의 약속에 대한 기본 지원


현재 버전의 Node.js에서 프라 미스에 대한 기본 지원이 있습니까?

Node.js는 V8 엔진을 사용합니다. 이 JavaScript 엔진은 Chrome에서도 사용되며 Chrome 32는 promise를 기본적으로 지원합니다. 그러나 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/


노드가 Chrome 32에서 사용하는 것과 동일하거나 이후 버전의 V8을 사용하는 경우 기본적으로 지원 될 수 있습니다. 그렇지 않으면 'es6-shim' 을로드해야합니다 ( es5-shim을 먼저 로드하는 것이 좋습니다 ). 현재 노드 릴리스에서 사용중인 V8 버전을 알 수 없습니다.

내 노드 설치에서

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

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는 아직 베타 버전이므로 프로덕션에서 사용할 경우주의하세요.


OP가이 게시물을 작성한 지 꽤 오랜 시간이 지났지 만 여전히 검색을 통해이 질문을 찾을 수 있도록 관리하는 사람들을 업데이트하고 싶었습니다.

Node.js added native support for Promises since it merged with io.js. This happened on September 8, 2015 (as per this news post on the official Node.js site) with the first stable release of Node v4.0.0.

A host of new ES6 features, such as Promises, were added with version 4. You can read more about them here.

EDIT: Of note, it appears as though Bluebird's Promise performs better than the native implementation of Promise.


It is important to point out that the accepted answer for this question is using a promise library which is not syntactically identical to the native JS promise feature as defined by the Promises/A+ spec.

If you want Node to, as closely as possible, mimic the browser then you should use the es6-promise module located at https://github.com/jakearchibald/es6-promise.

npm install es6-promise

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

Technical Differences:

One key difference in the module is in the very constructor: var foo = new Promise() is not valid in your browser, as the Promise constructor requires a function to initialize, and that function will be responsible for resolving or rejecting that promise. In the node-promises module, resolve is accessible to all users of the Promise, which breaks the encasuplation of the Promise.

Example using node-promises

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

Example using 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.

If you desire the ability to publically expose the resolve/reject capabilities you'll need to unfold the promise, example here.


I tried Node v0.11.12 with the --harmony flag, and it does not have native promises.

v0.11.13 and later with the --harmony flag does have Promise.


you will need to have newest V8 version - try compiling from master branch - there you will find V8 version 3.25.30 with Promises

quick comparison with 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

It looks like v0.12 supports promises, see node.Promise.


Although promises are not natively in node.js (yet). The IO.js fork of node.js has them natively. See: http://davidwalsh.name/es6-io

참고URL : https://stackoverflow.com/questions/21564993/native-support-for-promises-in-node-js

반응형