socket.io i Rx.js – część 2

Nadszedł czas poruszyć rzeczy dla mnie odrobinę trudne, z którymi nigdy nie miałem okazji dłużej popracować i lepiej się im przyjrzeć, czyli czas na Rx.js

Aby wyjaśnić gdzie chcę użyć programowania reaktywnego, zacznę od efektu, który chce osiągnąć. Zadaniem serwera jest wysyłanie informacji o aktualnie odtwarzanym utworze, aktualnej i nadchodzących audycjach, do strony internetowej, do odtwarzacza przygotowanego dla strony internetowej, oraz do aplikacji mobilnej. Inny zestaw danych będzie wykorzystywany przez każdy z tych elementów. Dodatkowo, dane do serwera będą spływały z dwóch źródeł. Systemu emisyjnego (który posiada informację, czy aktualnie gramy coś z systemu), oraz ze strony internetowej (która to posiada informacje o audycjach). Serwer weboscketowy ma również wysłać aktualny stan do nowo podłączonego klienta.

Można to wyobrazić sobie jako pewien stream, gdzie z 2 źródeł spływają informacje, które kolejno wysyłamy do podłączonych klientów.

Ale po kolei. System emisyjny, w momencie rozpoczęcia/zakończenia odtwarzania utworu, tworzy plik xml. Na serwerze jest aplikacja, która reaguje na tą zmianę i wysyła plik na jego podstawie dane do naszego serwisu.
W Rx.js można ten problem rozwiązać bazując na jednej z istniejących implementacji interfejsów Observable/Observer. Do tak stworzonego obiektu, możemy przekazywać kolejne wartości. Tak przekazane wartości mogą wywoływać dalsze akcje.

Tyle teorii. Dosyć szybko przyszło zderzenie z rzeczywistością zwaną dokumentacją.

ReplaySubject stores all the values that it has published. Therefore, when you subscribe to it, you automatically receive an entire history of values that it has published, even though your subscription might have come in after certain values have been pushed out. BehaviourSubject is similar to ReplaySubject, except that it only stored the last value it published.

Na tyle na ile zrozumiałem ten opis, wybrałem BehaviourSubject. Zachowuje 1 ostatni stan, i wysyła go do klienta po podłączeniu. Problem w tym, że wymaga zaincjalizowania go na początku pracy z nim. W moim przypadku jednak, ta wartość nie jest znana. Okazuje się jednak, że tworząc instancję ReplaySubject, możemy podać jako parametr długość bufora, który jest zapamiętywany. Ustawiamy go na jeden, i pierwszy problem rozwiązany 🙂

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *