2017-01-30 4 views
6

Warum gibt publishReplay (1) .refCount() den letzten Wert für späte Abonnenten nicht wieder?Warum wird Rxjs publishReplay (1) .refCount() nicht wiedergegeben?

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>

Erwartete Ausgabe:

timely subscribe: 1 
late subscriber: 1 

Tatsächliche Ausgabe

timely subscriber: 1 

Antwort

1

Ihr erster Teilnehmer a abonniert, da refCount zuerst den Strom aktiviert, wenn ist mindestens 1 Teilnehmer (von denen es keine gibt, weil nicht b aber a ist abonniert), es ist nicht aktiv bis Ihre letzte 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

Dies geschieht, weil zu der Zeit Sie a.next(1) rufen die publishReplay(1) zu seiner Quelle nicht abonniert hat beobachtbare (Subject a in diesem Fall) und damit die interne ReplaySubject den Wert nicht erhalten 1.

In RxJS 5 passiert die eigentliche Subskription zwischen Operatoren, wenn Sie am Ende der Kette abonnieren, die b.subscribe(...) in diesem Beispiel ist. Siehe:

Bis Sie subscribe() rufen die Betreiber gekettet dank lift() Methode, die nur eine Instanz von Operator nimmt und weist sie den neuen beobachtbar ist. Die Methode operator.call(), wie Sie in den beiden obigen Links sehen können, wird später beim Abonnieren aufgerufen. Siehe:

Verwandte Themen