consdata.com
Blog techniczny Blog biznesowy Dział HR
EN
rxjs

Czy wiesz, że za pomocą operatora shareReplay możesz cache'ować dane z observable?

author Piotr Tatarski
17 listopada 2025

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ść.

const source$: Observable<number> = of(Math.round(Math.random() * 1000))
    .pipe(shareReplay());
source$.subscribe((x: number) => console.log('s1: ', x));
source$.subscribe((x: number) => console.log('s2: ', x));

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.

shareReplay({ bufferSize: 3, refCount: true, windowTime: 500 })

W rezultacie:

  • zostaną umieszczone w buforze 3 ostatnie wartości,
  • każda z osobna będzie miała czas życia ustawiony na pół sekundy,
  • w momencie, gdy nie będzie żadnej aktywnej subskrypcji, bufor zostanie wyczyszczony.

Przydatne linki

StackBlitz - Przykład interaktywny

Rxjs - Oficjalna dokumentacja

Github - Kod źródłowy

Najnowsze wpisy

  • Czy wiesz, że za pomocą operatora shareReplay możesz cache'ować dane z observable?
  • Jak wykryć i naprawić błędne konfiguracje w działającym klastrze Kubernetes
  • Czy wiesz dlaczego nie powinno się stosować adnotacji @Transactional w testach integracyjnych z Hibernate?
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA

newsletter

techniczny

Zapisz się

Podobne wpisy

post-image
rxjs

Czy wiesz, że za pomocą operatora shareReplay możesz cache'ować dane z observable?

author
Piotr Tatarski 17 lis 2025
post-image
kubernetes

Jak wykryć i naprawić błędne konfiguracje w działającym klastrze Kubernetes

author
Bartłomiej Domżalski 26 wrz 2025
post-image
transactions

Czy wiesz dlaczego nie powinno się stosować adnotacji @Transactional w testach integracyjnych z Hibernate?

author
Robert Mastalerek 1 wrz 2025
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA

Zapisz się na

newsletter

techniczny

consdata.com
  • Kontakt

    • sales@consdata.com
    • +48 61 41 51 000

  • Biuro

    • K9Office
      Krysiewicza 9/14
      61-825 Poznań
      Polska

  • Rozwiązania

    • Eximee
    • Kouncil
  • Blog Dołącz do nas
Copyright © 2024 Consdata. All rights reserved. Privacy Policy & Cookies
Chcemy używać plików cookie oraz skryptów podmiotów trzecich do polepszania funkcjonowania tej strony Zgadzam się