2016-05-01 20 views
15

Rozumiem różnice między obserwacjami gorącymi i zimnymi, ale zawsze widzę ludzi używających gorących obserwowalnych zamiast zimnych; w rzeczywistości, jeśli ktoś przypadkowo użyje zimnego obserwowalnego, jest uważany za błąd, ponieważ często jest przyczyną niechcianych zachowań.Jaki jest przypadek użycia zimnych obserwowalnych przedmiotów?

Co to jest przypadek, w którym wolisz lub wykorzystasz zimno obserwowalne na gorącym?

+0

Chodzi o to, że jest zimno, gdy * nie jest używane *. Możesz stworzyć obserwowalne, bez względu na to, czy jest używane, czy nie, ale nie będzie pobierać żadnych zasobów. – Bergi

+0

@Bergi, więc co jest zaletą? Lenistwo? – m0meni

Odpowiedz

5

Przede wszystkim, zapraszam do przejrzenia Hot and Cold observables : are there 'hot' and 'cold' operators?, aby upewnić się, że masz dogłębną wiedzę na temat gorącego i zimnego.

Zimne obserwowalne pozwalają na lenistwo producentów i jest to bardzo pożądana funkcja. Odpady są wartością produkcyjną (produkcja może być kosztowna), gdy nie ma zastosowania tych wartości (brak konsumentów). Ponieważ takie zimne obserwowalne obiekty są budulcem ... z którego pochodzą częściej gorące obserwowalne obiekty.

Jako taki najczęstszym przypadkiem użycia dla zimnych obserwowalnych jest leniwie uzyskiwać gorące obserwowalne obiekty. Jeśli o tym pomyślisz, musisz jakoś programowo zbudować te gorące obserwowalności. Jednym ze sposobów jest używanie przedmiotów (wtedy jesteś producentem). Innym sposobem jest wyprowadzenie ich z innych istniejących obserwatorów za pośrednictwem operatorów, wcześniej istniejących obserwatorów, które również pochodzą od innych itd. Na końcu łańcucha należy znaleźć Rx.Observable.create i jest to zimne obserwowalne.

Używasz zimnego obserwowalnego, gdy potrzebujesz leniwości (zaczynasz wytwarzać wartości tylko wtedy, gdy są konsumenci lub kontrolujesz początek procesu produkcyjnego). Na przykład: defer pozwala na uruchomienie producenta tylko wtedy, gdy jest konsument. Może być używany, gdy masz na przykład gorący obserwowalny, ale nie jesteś jeszcze gotowy, aby go posłuchać.

Potrzebne są również obserwatory zimne, gdy konieczne jest odtworzenie procesu tworzenia wartości (każdy nowy subskrybent ponownie uruchomi ten sam proces). Jest tak na przykład w przypadku testowania, w którym chcesz użyć tej samej sekwencji kilka razy, ale z różnymi klientami i w różnych momentach.

W końcu pytanie brzmi bardziej jak filozoficzne. Masz do dyspozycji dwa narzędzia, ważne jest, aby zrozumieć, czego potrzebujesz, co masz i co działa w twoim przypadku użycia.

2

Co to jest przypadek, w którym wolisz lub wykorzystasz zimno obserwowalne na gorącym?

Mam nadzieję, że nie jestem rzeczy oczywiste, ale każda sytuacja, w której chcesz uzyskać dostęp wszystkie wartości (lub podzbiór przybył filtrując komplet) z historii zauważalny jest.

Pierwszy przykład, który przychodzi na myśl, to uśrednienie wszystkich wyników testu ucznia, a nie tylko wyników uzyskanych po zasubskrybowaniu.

+0

Ach, to ma sens. Czy jednak możesz uogólnić swoją odpowiedź? Czy są jakieś inne przypadki? Co mają ze sobą wspólnego? Wreszcie, dlaczego gorące strumienie nie mogą osiągnąć tych rzeczy? – m0meni

+1

@ ar7 O ile rozumiem, myślę, że każdy scenariusz z pełną historią obserwowalną (lub jej podzbiorem poprzez filtrowanie całego zestawu) wymagałby obserwowania zimna. Również odpowiedź [this] (http://stackoverflow.com/questions/2521277/what-are-the-hot-and-cold-observables#3522506) i powiązany post na blogu dotykają Twojego pytania o lenistwo. – pdoherty926

+1

@ ar7 Dodatkowo znalazłem sekcję [Analogies] (https://github.com/React-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables) RxJS dokumenty do oświecenia. – pdoherty926

4

Trzon odpowiedź leży w lakonicznym podsumowaniem Ben Lesh za:

TL; DR: chcesz HOT zaobserwować, gdy nie chcesz, aby utworzyć producent kółko.

W bezpośredniej odpowiedzi na pytanie "Jaki jest przypadek, w którym wolisz lub użyj zimna obserwowalnego na gorącym?", Przedstawię zarówno ogólną odpowiedź, jak i konkretny przykład.

Zasadniczo wygodniej jest używać chłodu obserwowalnego do modelowania strumieni, które są tworzone za każdym razem, gdy są potrzebne, niż do tworzenia gorących i próbowania ich sparafrazować.

W szczególności rozważ następujący prosty przykład. Powiedzmy, że chcesz odpowiedzieć na kliknięcie przycisku, odliczając od 10. Jeśli przycisk zostanie kliknięty ponownie podczas odliczania, zacznie się od nowa o 10. Jeśli klikniesz "$ model" zdarzeń przycisku, możesz mieć coś takiego:

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

Zastanów się, jak byłoby to modelowane bez zauważalnego zimna. W jaki sposób:

  1. Zainicjować strumień wcześniej, aby odpowiednie wartości były dostępne w razie potrzeby?
  2. Unikaj zajmowania się ułamkiem sekundy między tykami interwałów a czasem subskrypcji?
  3. Skorzystaj z liczby porządkowej, która może zaczynać się od dowolnej liczby zamiast 1?
  4. Zarządzaj logiką czyszczenia strumienia?

1 i 3 można łatwo rozwiązać, ale 2 i 4 są nieprzyjemne.

W odpowiedzi na twoje drugie pytanie "Czy to lenistwo?" Twierdzę, że tak nie jest. Zimny ​​obserwowalny może pozostawić go do momentu subskrypcji, aby wytworzyć jego wartości. Gorący obserwowalny może pozostawić go do momentu subskrypcji, aby zawiesić odpowiednie zdarzenia. Oboje są leniwi na swój sposób (a przynajmniej mogą być). Główna różnica polega na tym, co Ben Lesh powiedział: czy chcesz za każdym razem stworzyć producenta? A czasami tak naprawdę.