Rx dublowanie pracy

0

Mam taki przykład i trochę oczom nie wierzę:

var source = Rx.Observable.timer(0, 1000)
    .map(function (x) { return x * 5; })
    .map(function (x) { 
      console.log('SCANNED ' + x); 
      return x; 
    })
    .take(5);

var subscription1 = source.subscribe(
    function (x) { console.log('Next: ' + x); },
    function (err) { console.log('Error: ' + err); },
    function () { console.log('Completed'); });

var subscription2 = source.subscribe(
    function (x) { console.log('Next: ' + x); },
    function (err) { console.log('Error: ' + err); },
    function () { console.log('Completed'); });

Przykład można odpalić tutaj

Czemu podpięcie dodatkowej subskrybcji rzutuje na wykonanie w ten sposób, że cała praca jak jest wykonana przez source wykonuje się tyle razy ile jest subów? Ja myślałem, że source wylicza swoje wyniki raz i że później po prostu ogłasza swój wynik tyle razy ile jest subów, no a tu jednak jest zupełnie inaczej. Czy ktoś wie mniej więcej czemu tak jest? Jakie założenie powoduje, że to nie działa tak jak mi się wydawało?

2

Tak jest to normalne zachowanie dla Observables. Za każdym razem gdy subskrybujesz do Observable, jeżeli twój observable sam produkuje dane (nie pobiera ich z zewnatrz) jest szansa że każdy subscriber dostanie inne dane / zostaną wywołane akcje "z których korzysta" twój observable. To się nazywa Cold Observable, w sytuacji gdy Observable pobiera dane z zewnątrz - to jest Hot observable.

https://medium.com/@luukgruijs/understanding-hot-vs-cold-observables-62d04cf92e03#:~:text=An%20Observable%20is%20cold%20when,share%20data%20between%20multiple%20subscribers.&text=subscriber%20or%20not.-,If%20there%20is%20no%20subscriber%20when%20the%20data%20is%20being,the%20data%20is%20simply%20lost.

0

Gdy czytam ten wpis to mózg mi przekręcił się w poprzek.

Czemu? Czemu ten Cold może rzucać różnymi danymi?

Ja próbuje to teraz tak rozumieć:

  • taki cold z założenia jest leniwy, produkuje dane gdy wie, że ktoś na nie czeka
  • gdyby najpierw zgłosił się po dane 1 sub to cold zaczyna coś produkować i gitara
  • ale gdyby pojawił za jakiś czas drugi czy trzeci sub to by oznaczało, że cold musiałby wszystko co produkuje buferować jeśli miałby wszystko wszystkim przekazać

więc o to chodzi?

Ja myślałem, że streamy to w swoim założeniu nie gubią danych, bo właśnie je buferują po drodze.

2

Observables z założenia są leniwe, tutaj nie ma nic do rzeczy czy są one Cold czy są one Hot.

Jakby to napisać... każdy twój subscriber dostaje nowe źródło danych, którym w Twoim przypadku jest Observable.timer. Streamy nie gubią wartości, tylko subskrybenci nie dzielą między sobą źródła, emitowana wartość nie jest brana z zewnąrz (np. jak to jest w BehaviourSubject), tylko sam Observable produkuje dane. Gdybyś chciał, żeby subskrybenci wspóldzielili źródło, możesz skorzystać z operatora share. Natomiast nie jestem pewien, czy jest operator który pozwala na zapamiętywanie n ostatnich wartości, natomiast jest do tego specjalna klasa która na to pozwala: ReplaySubject.

https://alligator.io/rxjs/hot-cold-observables/
Co według Ciebie znaczy buforować?

0

Dzięki za odpowiedź! ;-)

Co według Ciebie znaczy buforować?

No właśnie zapamiętanie n ostatnich wartości. Np. jeden sub je konsumuje i w buferze mamy te n wartości przygotowane dla kolejnego suba. No, ale ostatecznie im dłużej o tym mniejszy widzę sens takiego podejścia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1