Często zdarza się, że nie chcemy za każdym razem ponownie wykonywać całej logiki z danego Observable —
zamiast tego wolimy przechować jego wynik w pamięci. W Angularze (i ogólnie w RxJS) możemy to zrobić za pomocą operatora shareReplay.
Czym jest shareReplay?
Operator shareReplay (tak jak operator share) pozwala na konwersję z cold do hot observable,
tak aby każda subskrypcja korzystała z tej samej emisji observable. Dodatkowo dane są zapisywane w wewnętrznym ReplaySubject
(w przeciwieństwie do operatora share), przez co każda nowa subskrypcja dostaje ostatnią wyemitowaną wartość (lub wartości jeżeli bufferSize > 1).
Przykład użycia
W przykładzie poniżej generujemy losową liczbę. Normalnie przy każdej subskrypcji otrzymalibyśmy nowy wynik,
ale dzięki shareReplay obie subskrypcje dostają dokładnie tę wartość.
W efekcie w konsoli pojawi się ta sama liczba w obu subskrypcjach, np.:
s1: 742
s2: 742
Opcje konfiguracji
Operator shareReplay posiada także dodatkowe opcje do skonfigurowania:
bufferSize - określa wielkość wewnętrznego ReplaySubject (domyślnie przechowuje ostatnią wartość),
refCount - określa, czy w momencie, gdy liczba subskrybentów wyniesie 0 shareReplay ma odsubskrybować się od źródłowego observable, co spowoduje wyczyszczenie cache (domyślnie false),
windowTime - ogranicza czas przechowywania wartości (czego domyślnie nie robi).
Przykład z dodatkowymi opcjami konfiguracji
Załóżmy, że chcemy cache’ować więcej niż jedną wartość i dodatkowo kontrolować czas ich przechowywania.