2017-01-30 30 views
6

Dlaczego funkcja publiczna publishReplay (1) .refCount() nie odtwarza ostatniej wartości dla ostatnich subskrybentów?Dlaczego Rxjs publikujeReplay (1) .refCount() nie odtwarza ponownie?

a = new Rx.Subject(); 
 
b = a.publishReplay(1).refCount(); 
 

 
a.subscribe(function(x){console.log('timely subscriber:',x)}); 
 
a.next(1); 
 
b.subscribe(function(x){console.log('late subscriber:',x)});
<script src="http://reactivex.io/rxjs/user/script/0-Rx.js"></script>

oczekiwany wynik:

timely subscribe: 1 
late subscriber: 1 

Rzeczywista moc

timely subscriber: 1 

Odpowiedz

1

Twój pierwszy abonent podpisuje się a, ponieważ refCount pierwszy aktywuje strumień, gdy istnieje jest co najmniej 1 subskrybentem (którego nie ma, ponieważ subskrybowany jest b, ale a), nie jest aktywny do ostatniego loc.

a = new Rx.Subject(); 
 
b = a.publishReplay(1).refCount(); 
 

 
b.subscribe(function(x){console.log('timely subscriber:',x)}); 
 
a.next(1); 
 
b.subscribe(function(x){console.log('late subscriber:',x)});
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

9

Dzieje się tak, ponieważ w momencie wywołania a.next(1)publishReplay(1) nie przyłącza się do jego źródła obserwowalnych (Temat a w tym przypadku), a zatem wewnętrzna ReplaySubject nie otrzyma wartość 1.

W RxJS 5 faktyczna subskrypcja między operatorami ma miejsce, gdy subskrybujesz na końcu łańcucha, który w tym przykładzie jest b.subscribe(...). Zobacz:

czasu wywołania subscribe() operatorzy są przykuci dzięki lift() metody, która właśnie trwa wystąpienie wykonawcy i przypisuje go do nowego widoczne. Metoda operator.call(), jak widać na dwóch powyższych linkach, jest wywoływana później podczas subskrybowania. Zobacz: