2016-03-17 19 views
25

Vì vậy, tôi đã đọc mà quan sát đang tìm kiếm để vượt qua những lời hứa về việc sử dụng trong một số sắp tới Javascript MVC của:Sự khác nhau giữa các quan sát và lời hứa trong JavaScript là gì?

sự khác biệt giữa quan sát và những lời hứa là gì ?

Đã cập nhật: Xin lỗi! loại bỏ tuyên bố giả mạo của tôi.

+3

Bạn nhớ chia sẻ một nguồn ở đâu bạn đọc cái này Cá nhân tôi chưa bao giờ nghe nói về các quan sát khác ngoài 'Object.observe' đã bị xóa khỏi thông số kỹ thuật và không liên quan gì đến Lời hứa – nem035

+0

Hoặc bạn đang nói về [Proxy] (https://developer.mozilla.org/vi -US/docs/Web/JavaScript/Tham chiếu/Global_Objects/Proxy)? – JCOC611

+1

Hứa hẹn: giá trị duy nhất, không đồng bộ. Có thể quan sát: bộ sưu tập, không đồng bộ. Xem http://reactivex.io/intro.html để triển khai đề xuất Quan sát được. –

Trả lời

26

Sự khác nhau giữa các quan sát và lời hứa là gì?

một cách đơn giản: Một lời hứa giải quyết đến một giá trị đơn không đồng bộ, một giải quyết quan sát (hoặc phát ra) nhiều giá trị không đồng bộ (theo thời gian).

ví dụ bê tông:

  • Promise: Phản hồi từ một Ajax gọi
  • Quan sát: Nhấp vào các sự kiện

Thông tin chi tiết có thể được tìm thấy ở đây: http://reactivex.io/intro.html

tôi đã đọc rằng các quan sát đang tìm cách vượt qua các lời hứa

Không chắc chắn. Quan sát có thể là giải pháp tốt hơn cho các vấn đề nhất định, nhưng điều đó không hứa hẹn lỗi thời (nếu đó là ý của bạn).

+3

Woah, đó không phải là sự khác biệt lớn chút nào - có một sự khác biệt lớn liên quan đến việc xử lý lỗi, lên lịch và mô hình. Lời hứa là giá trị _single_ và có thể quan sát giống như _function_ có thể được gọi để tạo ra nhiều giá trị. Một lời hứa luôn được lưu trữ và phát đa hướng - một quan sát là unicast. Nếu có thể quan sát được cuộc gọi ajax có hai người đăng ký - mỗi người sẽ (trừ khi sử dụng bộ kết hợp) tạo một cuộc gọi HTTP riêng. –

+3

@BenjaminGruenbaum Tôi nghĩ thật công bằng khi nói rằng câu trả lời này nhận được sự khác biệt chính và nhận xét của bạn chỉ ra sắc thái. –

31

Lời hứa là biểu thị của 1 giá trị tương lai. Quan sát là biểu diễn cho một số lượng giá trị vô hạn.

Lời hứa sẽ kích hoạt tìm nạp giá trị đó ngay lập tức khi tạo. Quan sát sẽ chỉ bắt đầu tạo ra các giá trị khi bạn đăng ký chúng. (Trừ khi nó có thể quan sát được, nhưng nằm ngoài phạm vi của câu hỏi này)

Lời hứa được thiết kế để đại diện cho các cuộc gọi AJAX. Quan sát được thiết kế để đại diện cho bất cứ điều gì: sự kiện, dữ liệu từ cơ sở dữ liệu, dữ liệu từ các cuộc gọi ajax, (có thể vô hạn), v.v.

21

Lời hứa cung cấp một cơ chế gọi lại rất đơn giản, trong đó Rx cung cấp khả năng trừu tượng hóa mạnh mẽ . An Observable thể hiện luồng dữ liệu, sau đó chúng tôi có thể áp dụng toán tử để xác định cách xử lý dữ liệu đến.

Nếu tất cả những gì bạn cần làm là thực hiện yêu cầu HTTP và sau đó cập nhật thành phần giao diện người dùng, sau đó sử dụng Lời hứa có thể đủ.

Tuy nhiên, hầu hết các ứng dụng có xu hướng có nhiều nhu cầu phức tạp hơn (ngay cả khi không rõ ràng ở lần đầu tiên).Lấy yêu cầu HTTP của chúng tôi, ví dụ, hãy xem cách mô hình hóa nó như một Quan sát và sử dụng một số toán tử Rx có thể giúp chúng tôi:

-Nếu yêu cầu HTTP được kích hoạt bởi hành động của người dùng, chúng tôi có thể muốn cảnh giác tắt nhiều yêu cầu HTTP (hãy tưởng tượng người dùng nhập vào hộp tìm kiếm). Chúng tôi không muốn kích hoạt yêu cầu cho mọi lần nhấn phím, vì vậy chúng tôi có thể muốn Điều chỉnh tìm kiếm của chúng tôi để chúng tôi chỉ kích hoạt yêu cầu nếu người dùng ngừng nhập 300ms. Hơn nữa, nếu người dùng nhập một từ, đợi 300ms và thêm một ký tự khác, chúng tôi sẽ kích hoạt yêu cầu HTTP tiếp theo. Với lời hứa, chúng tôi có thể gặp phải tình trạng đua xe vì chúng tôi không thể kiểm soát thứ tự mà chúng tôi sẽ nhận được phản hồi và chúng tôi không thể hủy yêu cầu cũ. Rx giải quyết vấn đề này bằng cách cho phép chúng tôi Chuyển đổi giữa các luồng, gọi Vứt bỏ trên các đăng ký yêu cầu cũ mà chúng tôi không còn quan tâm. Chúng tôi cũng có thể lọc ra bất kỳ đầu vào tìm kiếm không hợp lệ nào, ví dụ: Trong đó cụm từ tìm kiếm có độ dài nhỏ hơn 3 ký tự.

-Hỗ trợ để xử lý Thời gian chờ/Xử lý lỗi. Giả sử yêu cầu HTTP của chúng tôi không thành công, Rx cho phép chúng tôi dễ dàng Thử lại thực hiện yêu cầu.

-Hãy nói rằng một số phần trong ứng dụng của chúng tôi cần thực hiện cuộc gọi HTTP giống nhau, có thể chúng tôi không thực sự muốn thực hiện cuộc gọi nhiều lần. Chúng tôi có thể phơi bày mối quan hệ của chúng tôi với nhiều người tiêu dùng và sử dụng Phát lại để đảm bảo cuộc gọi được thực hiện một lần và kết quả được lưu vào bộ nhớ cache cho người đăng ký tiếp theo. Chúng tôi thậm chí có thể cung cấp một TimeSpan để phát lại, cho chúng ta hành vi bộ nhớ cache hết hạn.

-Thực hiện rõ ràng hơn về luồng thông qua việc sử dụng Trình lập lịch biểu, cho phép chúng tôi kiểm soát đồng thời. Thậm chí tốt hơn, chúng tôi có thể sử dụng Kiểm tra lịch biểu trong Bài kiểm tra đơn vị của chúng tôi để kiểm soát thời gian, cho phép chúng tôi mô phỏng Thời gian chờ, điều kiện chủng tộc, v.v.

Đây là một số ví dụ nhanh để chứng minh điều gì có thể. Có rất nhiều toán tử trong khuôn khổ Rx để phục vụ cho tất cả các kiểu kịch bản và tính tương thích của Rx có nghĩa là bạn có thể dễ dàng kết hợp các toán tử để xác định hành vi bạn cần. Cũng dễ dàng tạo các toán tử tái sử dụng của riêng bạn (ví dụ: RetryAfterDelay).

Tóm lại, Rx có thể làm mọi thứ hơn Promises có thể làm, và xa hơn nhiều. Tôi nghi ngờ trong vài năm tới sẽ có một sự thay đổi liên tục đối với Rx thay vì Promises.

Để đọc thêm, tôi khuyên bạn nên xem phần trên Đài quan sát trong Angular 2 guide.

6

như đã nói ở Angular 2 guid

Chuyển đổi sang một Promise thường là một lựa chọn tốt khi bạn muốn lấy một đoạn duy nhất của dữ liệu. khi bạn nhận được dữ liệu, bạn đã hoàn tất.

Nhưng trong một số trường hợp, yêu cầu không phải lúc nào cũng được thực hiện chỉ một lần. Bạn có thể bắt đầu một yêu cầu, hủy yêu cầu và thực hiện một yêu cầu khác trước khi máy chủ có số trả lời yêu cầu đầu tiên.

ví dụ trong thành phần tìm kiếm Khi người dùng nhập tên vào hộp tìm kiếm, bạn sẽ thực hiện các yêu cầu HTTP lặp lại bởi truy vấn tìm kiếm đó.

Chuỗi yêu cầu hủy yêu cầu mới khó thực hiện với Lời hứa, nhưng dễ dàng với Observables.

vì vậy nếu thành phần của bạn nhận dữ liệu chỉ với một yêu cầu đó là một lựa chọn tốt để sử dụng Promise nhưng nếu nó có một chuỗi các request-hủy-mới yêu cầu bạn nên sử dụng observable

Các vấn đề liên quan