2016-05-01 18 views
15

Tôi hiểu sự khác biệt giữa các quan sát nóng và lạnh, nhưng tôi luôn thấy những người sử dụng các quan sát nóng thay vì lạnh; trong thực tế, nếu ai đó vô tình sử dụng một quan sát lạnh, nó được coi là một sai lầm vì nó thường là một nguyên nhân của hành vi không mong muốn.Trường hợp sử dụng cho các quan sát lạnh?

Trường hợp bạn thích hoặc sử dụng lạnh có thể quan sát được trên thiết bị nóng?

+0

Mục đích là lạnh khi không sử dụng *. Bạn có thể tạo ra các quan sát, bất kể cho dù nó được sử dụng hay không, nhưng nó sẽ không mất bất kỳ tài nguyên. – Bergi

+0

@Bergi vì vậy lợi thế là gì? Sự lười biếng? – m0meni

Trả lời

5

Trước hết, tôi mời bạn xem lại Hot and Cold observables : are there 'hot' and 'cold' operators? để đảm bảo bạn hiểu thấu đáo về nóng và lạnh.

Quan sát lạnh cho phép sự lười biếng của nhà sản xuất và đây là một tính năng rất hấp dẫn. Nó là một sự lãng phí để tạo ra các giá trị (sản xuất có thể tốn kém) khi không có sử dụng làm bằng những giá trị đó (không có người tiêu dùng). Như các quan sát lạnh như vậy là khối xây dựng ... từ đó thường có các quan sát nóng hơn.

Vì vậy, trường hợp sử dụng phổ biến nhất đối với các quan sát lạnh là để có thể lấy được các quan sát nóng. Nếu bạn nghĩ về nó, bạn cần phải lập trình xây dựng những quan sát nóng này bằng cách nào đó. Một cách là sử dụng các chủ đề (sau đó bạn là nhà sản xuất). Cách khác là lấy chúng từ các quan sát từ trước khác thông qua các nhà khai thác, các quan sát từ trước cũng có nguồn gốc từ những người khác vv .. Vào cuối chuỗi, bạn sẽ tìm thấy Rx.Observable.create và đó là một quan sát lạnh.

Bạn sử dụng lạnh có thể quan sát khi bạn cần lười biếng (bắt đầu chỉ tạo ra giá trị khi có người tiêu dùng hoặc kiểm soát sự bắt đầu của quy trình sản xuất). Ví dụ: defer cho phép bạn chỉ bắt đầu một nhà sản xuất khi có người tiêu dùng. Nó có thể được sử dụng khi bạn có một ví dụ quan sát nóng nhưng bạn chưa sẵn sàng để nghe nó.

Bạn cũng cần các quan sát lạnh khi bạn cần tạo lại quy trình tạo giá trị (mỗi người đăng ký mới sẽ khởi động lại cùng một quy trình chính xác). Đây là ví dụ trường hợp cho mục đích thử nghiệm, nơi bạn muốn sử dụng chính xác cùng một chuỗi nhiều lần nhưng với người tiêu dùng khác nhau và tại các thời điểm khác nhau.

Cuối cùng, câu hỏi có vẻ giống một câu hỏi triết học hơn. Bạn có hai công cụ theo ý của bạn, những gì quan trọng là hiểu những gì bạn cần, những gì bạn có, và những gì làm việc cho trường hợp sử dụng của bạn.

2

Trường hợp bạn thích hoặc sử dụng lạnh có thể quan sát được trên thiết bị nóng?

Tôi hy vọng tôi không nêu rõ ràng, nhưng bất kỳ tình huống mà bạn muốn truy cập tất cả giá trị (hoặc một số tập hợp con đến bằng cách lọc các bộ hoàn chỉnh) từ lịch sử của một quan sát được.

Ví dụ đầu tiên mà bạn nghĩ đến là tính trung bình tất cả điểm kiểm tra của sinh viên, không chỉ là điểm số đã đến sau khi bạn đăng ký.

+0

Ah ok có ý nghĩa. Bạn có thể khái quát câu trả lời của mình một chút không? Có trường hợp nào khác không? Tất cả họ đều có chung điểm gì? Cuối cùng, tại sao suối nóng không thể đạt được những điều đó? – m0meni

+1

@ ar7 Theo như tôi hiểu, tôi nghĩ rằng bất kỳ kịch bản nào liên quan đến lịch sử hoàn chỉnh có thể quan sát được (hoặc một số tập hợp con của nó đến bằng cách lọc toàn bộ tập hợp) sẽ gọi cho một quan sát lạnh. Ngoài ra, [this] (http://stackoverflow.com/questions/2521277/what-are-the-hot-and-cold-observables#3522506) câu trả lời và bài đăng trên blog được liên kết chạm vào câu hỏi của bạn về sự lười biếng. – pdoherty926

+1

@ ar7 Ngoài ra, tôi đã tìm thấy [phần Tương tự] (https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables) của RxJS tài liệu để khai sáng. – pdoherty926

4

Cốt lõi của câu trả lời nằm trong bản tóm tắt ngắn gọn Bến Lesh của:

TL; DR: Bạn muốn có một HOT thể quan sát được khi bạn không muốn tạo sản xuất của bạn hơn và hơn nữa.

Trong câu trả lời trực tiếp cho câu hỏi "Trường hợp bạn thích hoặc sử dụng lạnh có thể quan sát được trên nóng?", Tôi sẽ cung cấp cả câu trả lời chung và ví dụ cụ thể.

Nói chung, việc sử dụng lạnh có thể quan sát được để mô hình các luồng được tạo ra mỗi khi chúng được yêu cầu nhiều hơn là tạo ra một nóng và cố gắng sắp xếp nó.

Cụ thể, hãy xem xét ví dụ tầm thường sau đây. Giả sử bạn muốn trả lời nhấp chuột vào nút bằng cách đếm ngược từ 10. Nếu nút được nhấp lại trong khi đếm ngược, nút sẽ bắt đầu lại ở 10. Nếu nhấp vào $ mô hình sự kiện nút, bạn có thể có thông tin như sau:

const subscription = click$ 
    .flatMapLatest(_ => Rx.Observable.interval(1000).take(10)) 
    .select(x => 10 - x) 
    .subscribe(x => console.log('clicked: ' + x)); 

Hãy xem xét cách thức này sẽ được mô hình hóa mà không có sự quan sát lạnh. Bạn sẽ như thế nào:

  1. Bắt đầu luồng trước để các giá trị thích hợp có sẵn khi được yêu cầu?
  2. Tránh phải đối phó với phần nhỏ của giây giữa các khoảng thời gian và thời gian đăng ký của bạn?
  3. Đối phó với các đơn vị có thể bắt đầu ở bất kỳ số nào thay vì chỉ 1?
  4. Quản lý logic dọn dẹp cho luồng?

1 và 3 có thể được giải quyết khá dễ dàng, nhưng 2 và 4 là khó chịu.

Để trả lời câu hỏi thứ hai của bạn "Có lười biếng không?" Tôi cho rằng nó không phải. Một lạnh quan sát có thể để nó cho đến thời điểm đăng ký để tạo ra giá trị của nó. Một quan sát nóng có thể rời khỏi nó cho đến thời điểm đăng ký để móc các sự kiện thích hợp. Cả hai đều lười biếng theo cách riêng của họ (hoặc ít nhất, có thể là). Sự khác biệt chính nằm ở những gì Ben Lesh nói: bạn có muốn tạo ra một nhà sản xuất mỗi lần không? Và đôi khi, bạn thực sự làm.

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