2017-01-30 23 views
6

爲什麼publishReplay(1).refCount()不會重播晚期訂戶的最後一個值?爲什麼Rxjs publishReplay(1).refCount()不能重放?

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>

預期輸出:

timely subscribe: 1 
late subscriber: 1 

實際輸出

timely subscriber: 1 

回答

1

你的第一用戶所預訂a,由於refCount第一激活流時,有至少有一個用戶(其中​​沒有用戶,因爲沒有b,但訂閱了a),直到您的最後一個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

這是因爲在一次調用a.next(1)publishReplay(1)尚未訂閱其來源可觀察(在這種情況下,主題a),因此內部ReplaySubject將不會收到值1

在RxJS 5中,運營商之間的實際訂閱發生在您訂閱鏈接的末尾(本例中爲b.subscribe(...))時。請參閱:

直到你打電話subscribe()的運營商鏈接感謝lift()方法,該方法只需要操作的實例,並將其分配給新的觀測。您可以在訂閱時稍後調用上述兩個鏈接中看到的operator.call()方法。請參閱: