Sự khác biệt giữa Trì hoãn, Hứa hẹn và Tương lai trong JavaScript là gì?

309
Tower 2011-07-24 05:10.

Sự khác biệt giữa Hoãn lại, Hứa hẹn và Hợp đồng tương lai là gì?
Có một lý thuyết được chấp thuận chung đằng sau cả ba điều này không?

5 answers

99
fncomp 2011-07-26 17:13.

Rõ ràng là không thích về cách tôi đã cố gắng trả lời câu hỏi của OP. Câu trả lời theo nghĩa đen là, một lời hứa là một cái gì đó được chia sẻ với các đối tượng khác, trong khi một lời hứa sẽ được giữ kín. Về cơ bản, một lời hứa bị hoãn lại (thường kéo dài Lời hứa) có thể tự giải quyết, trong khi một lời hứa có thể không thực hiện được.

Nếu bạn quan tâm đến những chi tiết vụn vặt, hãy kiểm tra Promises / A + .


Theo như tôi biết, mục đích bao quát là cải thiện sự rõ ràng và nới lỏng khớp nối thông qua một giao diện được tiêu chuẩn hóa. Xem bài đọc được đề xuất từ @ jfriend00:

Thay vì chuyển trực tiếp các lệnh gọi lại đến các hàm, một thứ có thể dẫn đến các giao diện được kết hợp chặt chẽ, việc sử dụng các hứa hẹn cho phép người ta tách các mối quan tâm về mã đồng bộ hoặc không đồng bộ.

Cá nhân tôi thấy việc trì hoãn đặc biệt hữu ích khi xử lý các mẫu, ví dụ như các mẫu được điền bởi các yêu cầu không đồng bộ, tải các tập lệnh có mạng lưới phụ thuộc và cung cấp phản hồi của người dùng để tạo dữ liệu theo cách không chặn.

Thật vậy, hãy so sánh hình thức gọi lại thuần túy của việc thực hiện điều gì đó sau khi tải CodeMirror ở chế độ JS không đồng bộ (xin lỗi, tôi đã không sử dụng jQuery trong một thời gian ):

/* assume getScript has signature like: function (path, callback, context) 
   and listens to onload && onreadystatechange */
$(function () {
   getScript('path/to/CodeMirror', getJSMode);

   // onreadystate is not reliable for callback args.
   function getJSMode() {
       getScript('path/to/CodeMirror/mode/javascript/javascript.js', 
           ourAwesomeScript);
   };

   function ourAwesomeScript() {
       console.log("CodeMirror is awesome, but I'm too impatient.");
   };
});

Đối với phiên bản công thức của lời hứa (một lần nữa, xin lỗi, tôi không cập nhật jQuery):

/* Assume getScript returns a promise object */
$(function () {
   $.when(
       getScript('path/to/CodeMirror'),
       getScript('path/to/CodeMirror/mode/javascript/javascript.js')
   ).then(function () {
       console.log("CodeMirror is awesome, but I'm too impatient.");
   });
});

Xin lỗi vì mã bán giả, nhưng tôi hy vọng nó làm cho ý tưởng cốt lõi rõ ràng. Về cơ bản, bằng cách trả về một lời hứa đã được chuẩn hóa, bạn có thể chuyển lời hứa xung quanh, do đó cho phép phân nhóm rõ ràng hơn.

147
Woahdae 2013-09-18 09:13.

Những câu trả lời này, bao gồm cả câu trả lời đã chọn, rất tốt cho việc giới thiệu các lời hứa về mặt khái niệm, nhưng thiếu chi tiết cụ thể về sự khác biệt chính xác trong thuật ngữ phát sinh khi sử dụng thư viện triển khai chúng (và có những khác biệt quan trọng).

Vì nó vẫn là một thông số kỹ thuật đang phát triển , câu trả lời hiện đến từ việc cố gắng khảo sát cả tham chiếu (như wikipedia ) và triển khai (như jQuery ):

  • Hoãn lại : Không bao giờ được mô tả trong các tài liệu tham khảo phổ biến, 1 2 3 4 nhưng thường được các triển khai sử dụng làm trọng tài giải quyết lời hứa (thực hiện và ). 5 6 7 resolvereject

    Đôi khi hoãn lại cũng là lời hứa (thực hiện then), 5 6 lần khác, nó được coi là thuần túy hơn khi chỉ có Khả năng hoãn lại mới có khả năng giải quyết và buộc người dùng phải truy cập vào lời hứa để sử dụng . 7 then

  • Lời hứa : Từ tổng hợp nhất cho chiến lược đang thảo luận.

    Một đối tượng proxy lưu trữ kết quả của một hàm mục tiêu có tính đồng bộ mà chúng tôi muốn trừu tượng hóa, cộng với việc hiển thị một thenhàm chấp nhận một hàm mục tiêu khác và trả về một lời hứa mới. 2

    Ví dụ từ CommonJS :

    > asyncComputeTheAnswerToEverything()
        .then(addTwo)
        .then(printResult);
    44
    

     

    Luôn được mô tả trong các tài liệu tham khảo phổ biến, mặc dù không bao giờ được chỉ rõ là giải pháp trách nhiệm thuộc về ai. 1 2 3 4

    Luôn hiện diện trong các triển khai phổ biến và không bao giờ có độ phân giải thấp. 5 6 7

  • Tương lai : một thuật ngữ dường như không còn được tìm thấy trong một số tài liệu tham khảo phổ biến 1 và ít nhất một cách triển khai phổ biến, 8 nhưng dường như bị loại bỏ khỏi cuộc thảo luận để ưu tiên cho thuật ngữ 'lời hứa' 3 và không phải lúc nào cũng được đề cập trong các phần giới thiệu phổ biến về chủ đề. 9

    Tuy nhiên, ít nhất một thư viện sử dụng thuật ngữ chung để trừu tượng hóa tính đồng bộ và xử lý lỗi, trong khi không cung cấp thenchức năng. 10 Không rõ có cố ý tránh thuật ngữ 'lời hứa' hay không, nhưng có lẽ là một lựa chọn tốt vì những lời hứa được xây dựng xung quanh 'những điều tốt đẹp'. 2

Người giới thiệu

  1. Wikipedia về Hứa hẹn & Tương lai
  2. Lời hứa / A + spec
  3. DOM Standard on Promise
  4. Thông số kỹ thuật hứa hẹn của DOM chuẩn
  5. Bộ công cụ DOJO bị hoãn lại
  6. jQuery Trì hoãn
  7. Q
  8. FutureJS
  9. Phần Javascript chức năng trên Promises
  10. Tương lai trong thử nghiệm tích hợp AngularJS

Những thứ có khả năng gây nhầm lẫn khó hiểu

  • Sự khác biệt giữa Hứa hẹn / A và Hứa hẹn / A +

    (TL; DR, Promises / A + chủ yếu giải quyết các điểm mơ hồ trong Promises / A)

73
Camilo Martin 2012-11-23 20:48.

Điều thực sự làm cho tất cả kích thích đối với tôi là bài thuyết trình này của Domenic Denicola.

Trong một ý chính trên github , anh ấy đã đưa ra mô tả mà tôi thích nhất, nó rất ngắn gọn:

Điểm của lời hứa là trả lại cho chúng ta thành phần chức năng và lỗi sủi bọt trong thế giới không đồng bộ.

Nói cách khác, các lời hứa là một cách cho phép chúng ta viết mã không đồng bộ gần như dễ viết như thể nó đồng bộ .

Hãy xem xét ví dụ này, với những lời hứa:

getTweetsFor("domenic") // promise-returning async function
    .then(function (tweets) {
        var shortUrls = parseTweetsForUrls(tweets);
        var mostRecentShortUrl = shortUrls[0];
        return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning async function
    })
    .then(doHttpRequest) // promise-returning async function
    .then(
        function (responseBody) {
            console.log("Most recent link text:", responseBody);
        },
        function (error) {
            console.error("Error with the twitterverse:", error);
        }
    );

Nó hoạt động như thể bạn đang viết mã đồng bộ này:

try {
    var tweets = getTweetsFor("domenic"); // blocking
    var shortUrls = parseTweetsForUrls(tweets);
    var mostRecentShortUrl = shortUrls[0];
    var responseBody = doHttpRequest(expandUrlUsingTwitterApi(mostRecentShortUrl)); // blocking x 2
    console.log("Most recent link text:", responseBody);
} catch (error) {
    console.error("Error with the twitterverse: ", error);
}

(Nếu điều này nghe có vẻ phức tạp, hãy xem bản trình bày đó!)

Liên quan đến Hoãn lại, đó là một cách để .resolve()hoặc .reject()hứa hẹn. Trong thông số kỹ thuật Promises / B , nó được gọi .defer(). Trong jQuery, nó $.Deferred().

Xin lưu ý rằng, theo như tôi biết, việc triển khai Promise trong jQuery đã bị hỏng (xem ý chính), ít nhất là kể từ jQuery 1.8.2.
Nó được cho là sẽ triển khai các tính năng Promises / A , nhưng bạn không nhận được cách xử lý lỗi chính xác mà bạn nên làm, theo nghĩa là toàn bộ chức năng "async try / catch" sẽ không hoạt động. Thật đáng tiếc, bởi vì có một "thử / bắt" với mã không đồng bộ là hoàn toàn tuyệt vời.

Nếu bạn định sử dụng Promises (bạn nên dùng thử chúng với mã của riêng mình!), Hãy sử dụng Q của Kris Kowal . Phiên bản jQuery chỉ là một số trình tổng hợp gọi lại để viết mã jQuery rõ ràng hơn, nhưng lại bỏ sót điểm.

Về Future, tôi không biết, tôi chưa thấy điều đó trong bất kỳ API nào.

Chỉnh sửa: Cuộc nói chuyện trên youtube của Domenic Denicola về Promises từ bình luận của @Farm bên dưới.

Một câu nói của Michael Jackson (vâng, Michael Jackson ) từ video:

Tôi muốn bạn ghi nhớ cụm từ này trong đầu: Lời hứa là một giá trị không đồng bộ .

Đây là một mô tả tuyệt vời: một lời hứa giống như một biến số từ tương lai - một tham chiếu hạng nhất cho một điều gì đó, tại một thời điểm nào đó, sẽ tồn tại (hoặc xảy ra).

32
IRSHAD 2016-02-03 20:42.

Một Promise đại diện cho một proxy cho một giá trị không nhất thiết phải biết đến khi sự hứa hẹn được tạo ra. Nó cho phép bạn liên kết các trình xử lý với giá trị thành công cuối cùng của hành động không đồng bộ hoặc lý do thất bại. Điều này cho phép các phương thức không đồng bộ trả về giá trị giống như các phương thức đồng bộ: thay vì giá trị cuối cùng, phương thức không đồng bộ trả về lời hứa có giá trị tại một thời điểm nào đó trong tương lai.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Các deferred.promise()phương pháp cho phép một chức năng không đồng bộ để ngăn chặn mã khác can thiệp vào tiến độ hoặc trạng thái của yêu cầu nội bộ của mình. Promise chỉ hiển thị các phương thức Trì hoãn cần thiết để đính kèm các trình xử lý bổ sung hoặc xác định trạng thái ( sau đó, thực hiện, thất bại, luôn luôn, đường ống, tiến trình, trạng thái và lời hứa ), nhưng không hiển thị các phương thức thay đổi trạng thái ( giải quyết, từ chối, thông báo, giải quyếtVới, từ chốiVới và thông báoVới ).

Nếu mục tiêu được cung cấp, deferred.promise()sẽ đính kèm các phương thức vào nó và sau đó trả về đối tượng này thay vì tạo một đối tượng mới. Điều này có thể hữu ích để đính kèm hành vi Promise với một đối tượng đã tồn tại.

Nếu bạn đang tạo Hoãn lại, hãy giữ tham chiếu đến Hoãn lại để nó có thể được giải quyết hoặc bị từ chối vào một thời điểm nào đó. Chỉ trả về đối tượng Promise thông qua deferred.promise () để mã khác có thể đăng ký các lệnh gọi lại hoặc kiểm tra trạng thái hiện tại.

Đơn giản chỉ cần chúng ta có thể nói rằng một Promise đại diện cho một giá trị mà vẫn chưa được biết nơi như một thu nhập hoãn lại đại diện cho công việc mà vẫn chưa xong.


23
mattLummus 2014-09-25 04:28.
  • A promiseđại diện cho một giá trị chưa được biết
  • A deferredđại diện cho công việc chưa hoàn thành

Một lời hứa là một trình giữ chỗ cho một kết quả ban đầu không được biết đến trong khi một lời hứa trả về đại diện cho việc tính toán dẫn đến giá trị.

Tài liệu tham khảo

  • http://blog.mediumequalsmessage.com/promise-deferred-objects-in-javascript-pt1-theory-and-semantics

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Desiree Rogers, trái, và Cheryl Mayberry McKissack Chuyển sang, Fenty Beauty và Pat McGrath, có một đế chế làm đẹp mới do phụ nữ làm chủ đang trỗi dậy. Sau thương vụ mua lại mỹ phẩm Black Opal vào tháng 9, đội ngũ quyền lực của Giám đốc điều hành công ty Desiree Rogers và Chủ tịch Cheryl Mayberry McKissack đã thông báo mua lại thương hiệu làm đẹp tiên phong Fashion Fair từ người sáng lập Johnson Publishing Company (JPC).

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Đối với những người có quá nhiều thời gian, tiệc tiết lộ giới tính là một cách thú vị để không cần áp đặt những định kiến ​​hạn chế lên thai nhi trước một đối tượng bạn bè giả vờ quan tâm một cách lịch sự. Tuy nhiên, việc chỉ dựa vào những chiếc bánh nướng có màu nhân tạo để biểu thị một tiếng hoo-ha hoặc một đứa trẻ đi tè đã trở nên xa xỉ trong các bậc cha mẹ trên Instagram.

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Hôm thứ Tư, cựu Bộ trưởng An ninh Nội địa Kirstjen Nielsen vì một lý do nào đó đã được đưa ra một diễn đàn để phát biểu tại Hội nghị thượng đỉnh Những người phụ nữ quyền lực nhất của Fortune. Và có thể đoán trước được, người phụ nữ giám sát các nỗ lực (đang diễn ra) của chính quyền Trump nhằm chia cắt các gia đình ở biên giới đã sử dụng thời gian của mình như một cơ hội để tự bảo vệ mình và tự nhận mình là người — và hãy hít thở sâu ở đây — “đã nói sự thật với quyền lực.

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Vì thế hệ mới nhất của chiếc xe điều chỉnh được yêu thích trên thế giới hiện đã có mặt tại đây, nên chỉ có điều kiện là Toyota Racing Development sẽ đưa phiên bản Supra thế hệ thứ năm sửa đổi của riêng mình đến SEMA vào tháng tới. Toyota đã cho chúng tôi một gợi ý về những gì sẽ xảy ra trong tuần này: một chiếc Concept GR Supra 3000GT hiện đại.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language