Chciałem zrozumieć te 3:
Temat , temat zachowania i temat powtórki . Chciałbym ich używać i wiedzieć, kiedy i dlaczego, jakie są korzyści z ich używania i chociaż przeczytałem dokumentację, obejrzałem tutoriale i przeszukałem google, nie udało mi się tego zrozumieć.
Więc jaki jest ich cel? Najbardziej ceniona byłaby rzeczywista obudowa, która nie musi nawet kodować.
Wolałbym jasne wyjaśnienie, a nie tylko „a + b => c jesteś subskrybentem ....”
Dziękuję Ci
javascript
angular
rxjs
reactive-programming
angular2-observables
Paul Samsotha
źródło
źródło
Odpowiedzi:
To naprawdę sprowadza się do zachowania i semantyki. Z
Subject
- subskrybent otrzyma tylko opublikowane wartości, które zostały wyemitowane po subskrypcji. Zadaj sobie pytanie, czy tego chcesz? Czy subskrybent musi wiedzieć cokolwiek o poprzednich wartościach? Jeśli nie, możesz tego użyć, w przeciwnym razie wybierz jedną z pozostałych. Na przykład z komunikacją między komponentami. Załóżmy, że masz komponent, który publikuje zdarzenia dla innych komponentów po kliknięciu przycisku. Możesz skorzystać z usługi z tematem do komunikacji.BehaviorSubject
- ostatnia wartość jest buforowana. Abonent otrzyma najnowszą wartość przy pierwszej subskrypcji. Semantyka tego przedmiotu polega na przedstawieniu wartości, która zmienia się w czasie. Na przykład zalogowany użytkownik. Początkowy użytkownik może być użytkownikiem anonimowym. Ale gdy użytkownik się zaloguje, nową wartością jest stan uwierzytelnionego użytkownika.BehaviorSubject
Inicjowany jest z wartością początkową. Czasami jest to ważne dla preferencji kodowania. Powiedz na przykład, że inicjalizujesz go za pomocą plikunull
. Następnie w swojej subskrypcji musisz sprawdzić zerową wartość. Może OK, a może denerwujące.ReplaySubject
- może buforować do określonej liczby emisji. Wszyscy subskrybenci otrzymają wszystkie wartości zapisane w pamięci podręcznej po subskrypcji. Kiedy potrzebujesz takiego zachowania? Szczerze mówiąc, nie miałem potrzeby takiego zachowania, z wyjątkiem następującego przypadku:Jeśli zainicjujesz a
ReplaySubject
z rozmiarem bufora1
, to w rzeczywistości zachowuje się tak jak aBehaviorSubject
. Ostatnia wartość jest zawsze buforowana, więc zachowuje się jak wartość zmieniająca się w czasie. Dzięki temu nie ma potrzebynull
sprawdzania, jak w przypadkuBehaviorSubject
inicjalizacji z rozszerzeniemnull
. W tym przypadku żadna wartość nie jest wysyłana do subskrybenta aż do pierwszej publikacji.Tak więc naprawdę sprowadza się to do zachowania, którego oczekujesz (od tego, którego użyć). W większości przypadków prawdopodobnie będziesz chciał użyć a,
BehaviorSubject
ponieważ to, co naprawdę chcesz reprezentować, to semantyczna „wartość w czasie”. Ale ja osobiście nie widzę nic złego w zamianieReplaySubject
inicjalizacji na1
.To, czego chcesz uniknąć, to używanie wanilii,
Subject
gdy naprawdę potrzebujesz zachowania pamięci podręcznej. Weźmy na przykład piszesz strażnika uciekającego lub rozwiązanie. Pobierasz dane z tej warty i ustawiasz je w usłudzeSubject
. Następnie w komponencie kierowanym subskrybujesz temat usługi, aby spróbować uzyskać wartość, która została wyemitowana w strażniku. OOP. Gdzie jest wartość? To już było wyemitowane, DUH. Użyj tematu "buforowania"!Zobacz też:
źródło
ReplaySubject
z rozmiarem bufora 1 był dokładnie tym, czego potrzebowałem. Miałem strażnika trasy, który potrzebował wartości, ale musiał czekać na pierwszą emisję. Więc aBehaviorSubject
nie wycinałem tego, ponieważ nie chciałem wartości początkowej (teżnull
nie działałoby, ponieważresolve
klasy strażników Angular . Moja usługa danych może być asynchroniczna lub synchroniczna (jeśli dane zostały już pobrane). Jeśli był synchroniczny, obiekt Subject.next () był uruchamiany, zanimresolve
funkcja została zwrócona i została wewnętrznie zasubskrybowana przez Angular. BehaviourSubject prawdopodobnie zadziałałoby, ale musiałbym jawnie wywołać,complete()
a także dodaćnull
sprawdzenia wartości początkowej. To, co zadziałało, było noweReplaySubject<DataType>(1)
iresolveSubject.asObservable().take(1).map(....)
.asObservable()
Observable, wysyłam wartośćnull
do subskrybentów, zanim kiedykolwieknext()
wywołam mój ReplaySubject. Myślałem, że nie powinno mieć wartości początkowej w przeciwieństwie do BehaviorSubject?Poręczne podsumowanie różnych obserwowalnych typów, nieintuicyjne nazewnictwo, które znam lol .
Subject
- Abonent otrzyma opublikowane wartości dopiero po dokonaniu subskrypcji.BehaviorSubject
- Nowi subskrybenci otrzymują ostatnią opublikowaną wartość LUB wartość początkową natychmiast po subskrypcji.ReplaySubject
- Nowi subskrybenci otrzymują wszystkie wcześniej opublikowane wartości natychmiast po subskrypcjiźródło
W tym przykładzie, oto wynik, który zostanie wydrukowany w konsoli:
Oto przykład użycia tematów powtórek, w których
buffer of 2 previous values
są przechowywane i emitowane przy nowych subskrypcjach:Oto, co daje nam to na konsoli:
A wynik:
Źródła: https://alligator.io/rxjs/subjects/
źródło
Od: Randall Koutnik książka „Build Reactive Websites with RxJS”. :
Temat jest obiektem, który jest turbodoładowany obserwowalne. W swej istocie, Temat działa podobnie jak zwykły obserwowalne, ale każda subskrypcja jest podpięty do tego samego źródła. Podmioty są również obserwatorami i mają następne, błędne i wykonane metody, aby przesłać dane do wszystkich subskrybentów jednocześnie. Ponieważ podmioty są obserwatorami, mogą zostać przekazane bezpośrednio do wywołania subskrypcji, a wszystkie zdarzenia z pierwotnego obserwowalnego zostaną przesłane przez podmiot do jego subskrybentów.
Możemy użyć ReplaySubject do śledzenia historii. ReplaySubject rejestruje ostatnie wydarzenia N i Pałys je z powrotem do każdego nowego abonenta. Na przykład w aplikacji do czatu. Możemy go użyć do śledzenia historii poprzednich czatów.
BehaviorSubject jest uproszczona wersja ReplaySubject . Obiekt ReplaySubject przechowuje dowolną liczbę zdarzeń, a BehaviorSubject rejestruje tylko wartość ostatniego zdarzenia. Za każdym razem, gdy BehaviorSubject rejestruje nową subskrypcję, emituje najnowszą wartość do subskrybenta, a także wszelkie nowe wartości, które są przekazywane. The BehaviorSubject jest przydatny w przypadku pojedynczych jednostek stanu, takich jak opcje konfiguracji.
źródło
Najbardziej pozytywna odpowiedź jest po prostu błędna, twierdząc, że:
„Jeśli zainicjujesz a
ReplaySubject
z rozmiarem bufora 1, to w rzeczywistości zachowuje się jak aBehaviorSubject
”To nie jest do końca prawdą; sprawdź ten wspaniały wpis na blogu dotyczący różnic między nimi. Na przykład, jeśli zasubskrybujesz ukończone
BehaviorSubject
, nie otrzymasz ostatniej wartości, ale za aReplaySubject(1)
otrzymasz ostatnią wartość.To jest ważna różnica, której nie należy przeoczyć:
Sprawdź ten przykład kodu , który pochodzi z innego świetnego wpisu na blogu na ten temat.
źródło
źródło