2015-09-28 34 views
7

Những ưu điểm của & điểm yếu của Javascript Promises và jQuery Deferred Objects là gì?Javascript Promise vs jQuery Deferred

Ví dụ: mỗi sự cố có những vấn đề gì, nếu có?

Một thành viên stack overflow đồng tuyên bố:

"... những lời hứa thực là có thật, và những lời hứa giả là giả mạo."

Ý của anh ấy là gì?

+0

Một số người có lẽ là đúng, nhưng đây không phải là cách hay để giải quyết tranh cãi. Súng ngắn vào lúc bình minh. – Pointy

+0

Một số người bị nhầm lẫn, hoàn toàn vì IE không hỗ trợ javascript Promises và nó chưa trưởng thành. trong tương lai anh ta sẽ đúng. – Saar

+0

@Pointy, lol, tôi đang tìm kiếm một câu trả lời hợp pháp (không cố gắng tranh luận về điều này). Nếu anh ta đúng, tôi muốn biết tại sao, và không dựa vào phản ứng khó hiểu của anh ta. – picokol

Trả lời

9

Không có điều gì như "lời hứa thực sự" hoặc "lời hứa giả". Có triển khai hứa hẹn rằng tuân thủ các tiêu chuẩn hiện hành và có triển khai hứa hẹn rằng không tuân thủ các tiêu chuẩn hiện hành. Không có thuộc tính vốn có của lời hứa nói rằng đó là "thực" hoặc "giả". Chúng là các bit của Javascript thực hiện một hành vi chuẩn.

Bất kỳ triển khai lời hứa nào tuân thủ nghiêm ngặt tiêu chuẩn sẽ là tốt để sử dụng và phải tương thích với các triển khai hứa hẹn chuẩn khác. Hầu hết sẽ xem xét khả năng tương tác và tuân thủ các tiêu chuẩn được chấp nhận một đặc tính hữu ích.

Bây giờ, các lời hứa của jQuery không tuân theo các tiêu chuẩn hứa hẹn, nơi mà một số người nói xấu về các lời hứa của jQuery. Họ dường như đang làm việc để làm cho họ tiêu chuẩn hơn cho một phiên bản tương lai của jQuery, nhưng họ hiện đang đi chệch khỏi các tiêu chuẩn theo nhiều cách. Điều này dẫn đến các vấn đề trong đó bạn phải viết mã khác nhau khi sử dụng các lời hứa jQuery hơn khi sử dụng các lời hứa tiêu chuẩn. Vì vậy, mã lời hứa jQuery không giống như mã lời hứa ES6.

vấn đề trong jQuery Promises

Xem this reference cho một danh sách các vấn đề với những lời hứa jQuery hiện hành. Hai vấn đề chính là vấn đề với việc xử lý lỗi trong các lời hứa bị từ chốisự không thống nhất theo thứ tự thực hiện .then() gọi lại có thể dẫn đến việc thực thi mã không thể đoán trước hoặc không nhất quán. Tất cả các trình xử lý .then() được cho là sẽ được thực hiện không đồng bộ (sau khi chuỗi hiện tại của JS giải phóng). jQuery hứa hẹn không phải lúc nào cũng làm điều này và nó có thể gây ra vấn đề trong một số loại mã.

Nhà nước Promises Native trong trình duyệt

lời hứa Native là một điều hơi mới trong các trình duyệt, do đó, nó chưa phải là trường hợp đó bạn chỉ có thể dựa vào thực tế là tất cả các trình duyệt có thể nhấn trang web của bạn sẽ thiết Các lời hứa gốc được xây dựng trong các trình duyệt bắt đầu với Safari 7.1, Firefox 29, Chrome 32, Edge, Android 4.4.4, iOS 8.4 và chưa có trong IE (tính đến tháng 9 năm 2015). Vì vậy, bạn vẫn cần một trình duyệt khá gần đây để có hỗ trợ lời hứa gốc. Như vậy, có rất nhiều thư viện hứa hẹn tuyệt vời có thể cung cấp hoặc thay thế toàn bộ hoặc thay thế đầy đủ, do đó giúp mã của bạn có khả năng sử dụng lời hứa trong bất kỳ trình duyệt nào thực sự không thỏa hiệp so với lời hứa gốc.

+0

Tôi muốn nó nếu điều này bao gồm một số bình luận về cách javascript hứa hẹn có nguồn gốc trong hầu hết các trình duyệt hiện nay bao gồm Edge mới của Microsoft, tuy nhiên, sẽ luôn có vấn đề với khả năng tương thích trình duyệt cũ (IE). Ngoài ra, tôi nghĩ đây là câu trả lời hay cho câu hỏi của tôi. – picokol

+0

@picokol - Tôi đã thêm nhận xét về trạng thái lời hứa gốc trong trình duyệt. – jfriend00

3

Lời hứa JavaScript tốt hơn vì nó tuân thủ tiêu chuẩn. Một ngày nào đó họ sẽ có sẵn trên tất cả các trình duyệt nguyên bản. Bây giờ bạn có thể sử dụng một cái gì đó như babel để sử dụng ES6 Promises ngày hôm nay: https://babeljs.io/docs/learn-es2015/#promises.