Hỗ trợ riêng cho những lời hứa trong Node.js


76

Có hỗ trợ gốc cho các lời hứa trong các phiên bản hiện tại của Node.js không?

Node.js sử dụng động cơ V8. Công cụ JavaScript này cũng được Chrome sử dụng và Chrome 32 có hỗ trợ gốc cho các hứa hẹn. Nhưng tôi dường như không thể nhận được những lời hứa sẽ hoạt động (nguyên bản) trong Node.js.

Tôi đã thử mã sau trong Chrome 32 và nó hoạt động.

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

Tuy nhiên, khi tôi thử mã này trong Node.js, tôi nhận được:

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

Mã này là từ hướng dẫn tuyệt vời:

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


1
Hỗ trợ gốc trong Node không quá hữu ích cho đến khi tất cả các mô-đun bắt đầu sử dụng nó. Hãy hứa tất cả những điều.
Rudie


6
@StevenLu: Điều đầu tiên tôi đọc sau khi nhấp vào liên kết của bạn:BEWARE This article is old, it's 2013 old. Since then things have changed and a winner has prevailed, Bluebird is a Promises Library build with performance in mind and when actually tested with the benchmarks of this article it did even better than Async!
Trevor

6
Xin mọi người lưu ý rằng tuyên bố của Bluebird là nhanh nhất đã có từ lâu đời, tuyên bố về tốc độ của nó về cơ bản chỉ là một trường hợp cạnh ngắn mạch và mỗi khi tôi cá nhân thử nghiệm nó, rõ ràng nó không phải là nhanh nhất. Cá nhân tôi sử dụng when.js vì nó có nhiều tính năng giúp cuộc sống của tôi dễ dàng hơn, nhưng khi tôi thực hiện một phép so sánh hiệu suất, nó luôn nhanh hơn Bluebird và kew một chút. Thư viện duy nhất mà bạn có thể gọi là 'chậm' là Q, và nó đã không được cập nhật trong 4 năm nay. Nếu bạn chọn thứ gì đó cho tốc độ, hãy tự mình kiểm tra nó trước!
Andrew

Câu trả lời:


23

Nếu nút đang sử dụng phiên bản V8 giống hoặc mới hơn mà Chrome 32 sử dụng thì nút đó có thể được hỗ trợ nguyên bản. Nếu không, bạn sẽ cần tải 'es6-shim' (tôi khuyên bạn nên tải es5-shim trước) Tôi không biết phiên bản V8 mà bản phát hành hiện tại của nút đang sử dụng.

Trên cài đặt nút của tôi

node --version
v0.10.24

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

Chrome V32 đang sử dụng phiên bản nào? (Tôi đang sử dụng Chromium v27), vì vậy sẽ phải tìm tài liệu, nhưng có thể là 3.22.24.16

Nhìn vào chrome://version/dường như cung cấp thông tin

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

Và bây giờ từ cài đặt 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

Trong dòng lệnh Windows (10), kiểm tra phiên bản Node cần phải nằm trong dấu ngoặc kép, tức là nút -e "console.log (process.versions.v8)"
AndyS

55

Mặc dù Node.js đã bổ sung thêm bản gốc trong phiên bản ổn định 0.12.

Nhưng do vấn đề rò rỉ bộ nhớ, tôi khuyên bạn nên sử dụng bluebirdđể tránh sự cố.


Anwser cũ:

Node.js đã thêm hỗ trợ hứa hẹn gốc kể từ phiên bản 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

Lưu ý: Node.js v0.11vẫn đang trong giai đoạn thử nghiệm, hãy cẩn thận nếu sử dụng nó trong sản xuất.


2
Có ai biết nếu rò rỉ bộ nhớ được đề cập vẫn còn ở nút 4/5 không?
1nfiniti

1
Thật không may, câu trả lời là có. Để biết thêm thông tin: github.com/nodejs/node/issues/4210 .
Chris

@ 1nfiniti không, vấn đề do Chris liên kết hiện đã bị đóng
Janus Troelsen

1
@JanusTroelsen cũng "Đóng cửa vì nó không phải là một vấn đề có thể xử lý ngay bây giờ." không giống như cố định của nó ...
LJ ᛃ

1
@LJ ᛃ nhận xét mới nhất hiện cho biết "bản sửa lỗi đã cập bến V8 master vào năm ngoái, vì vậy tôi nghĩ nó đã hạ cánh ở Node ngay bây giờ"
Aur Saraf

43

Tôi biết đã khá lâu kể từ khi OP thực hiện bài đăng này, nhưng tôi muốn cập nhật những người vẫn đang quản lý để tìm câu hỏi này thông qua tìm kiếm.

Node.js đã thêm hỗ trợ gốc cho Promises kể từ khi nó hợp nhất với io.js. Điều này xảy ra vào ngày 08 tháng 9 2015 (theo này đăng tin tức trên trang web chính thức Node.js) với việc phát hành ổn định đầu tiên của Node v4.0.0.

Một loạt các tính năng mới của ES6, chẳng hạn như Promises, đã được thêm vào phiên bản 4. Bạn có thể đọc thêm về chúng tại đây .

CHỈNH SỬA: Lưu ý, có vẻ như Bluebird's Promise hoạt động tốt hơn so với triển khai gốc của Promise .


39

Điều quan trọng là chỉ ra rằng câu trả lời được chấp nhận cho câu hỏi này đang sử dụng thư viện lời hứa không giống về mặt cú pháp với tính năng hứa hẹn JS gốc như được định nghĩa bởi thông số Promises / A + .

Nếu bạn muốn Node bắt chước trình duyệt càng gần càng tốt thì bạn nên sử dụng es6-promisemô-đun có tại https://github.com/jakearchibald/es6-promise .

npm install es6-promise

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

Sự khác biệt kỹ thuật:

Một điểm khác biệt chính trong mô-đun là ở chính hàm tạo: var foo = new Promise()không hợp lệ trong trình duyệt của bạn, vì hàm Promisetạo yêu cầu một hàm để khởi tạo và hàm đó sẽ chịu trách nhiệm giải quyết hoặc từ chối lời hứa đó. Trong node-promisesmô-đun, tất cả người dùng Promise đều có thể truy cập được phân giải, điều này phá vỡ cách mã hóa của Promise.

Ví dụ sử dụng node-promises

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

Ví dụ sử dụng 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.

Nếu bạn muốn có khả năng thể hiện công khai các khả năng giải quyết / từ chối, bạn sẽ cần mở ra lời hứa, ví dụ ở đây .


Đọc qua bài đăng của bạn, tôi quyết định dùng thử es6-promise, nhưng gặp một số vấn đề khi cài đặt es6-promise s , vì đó là những gì bạn gọi nó ngay trước mẫu mã cuối cùng. Tôi nghĩ tôi sẽ đề cập đến nó trong trường hợp có ai khác làm điều tương tự.
hansn

câu trả lời này bây giờ đã lỗi thời
Janus Troelsen

như LJ đã đề cập, vấn đề đã được đóng nhưng có vẻ như nó không được giải quyết vì vậy tôi không nghĩ câu trả lời là lỗi thời
ABCD.ca

6

Tôi đã thử Node v0.11.12 với cờ --harmony và nó không có các hứa hẹn gốc.

v0.11.13 trở lên với cờ --harmony không có Lời hứa.


3

bạn sẽ cần có phiên bản V8 mới nhất - hãy thử biên dịch từ nhánh chính - ở đó bạn sẽ tìm thấy phiên bản V8 3.25.30 với Promises

so sánh nhanh với tiêu chuẩn 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

3

Có vẻ như v0.12 hỗ trợ các hứa hẹn, hãy xem node.Promise .


2
Ừm, đó là v0. 1 .12 - từ năm 2011! Và những "lời hứa" đó thậm chí không thể hiểu được từ những gì tôi có thể đọc ở đó.
Bergi

Chết tiệt! Vâng, v0.1.12 so với v0.12 tạo ra sự khác biệt lớn. Cảm ơn vì đã sửa tôi. Vì vậy, có phải sự hỗ trợ thiếu hứa hẹn là một phần nguyên nhân thúc đẩy cuộc nổi dậy của IO.js không? Bản thân mình, bây giờ, tôi chỉ sử dụng Q .
Lonnie Best

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.