使用 publishReplay 時出現意外的排放

基於一個問題 。以下程式碼段不會快取預期的發射並阻止進一步的呼叫。相反,它為每個訂閱重新訂閱 realSource

var state = 5
var realSource = Rx.Observable.create(observer =>  {
  console.log("creating expensive HTTP-based emission"); 
  observer.next(state++);
//  observer.complete(); //absent on purpose
  
  return () => {
    console.log('unsubscribing from source')
  }
});

var source = realSource
.do(null, null, () => console.log('stream completed'))
.publishReplay()
.refCount();
    
subscription1 = source.subscribe({next: (v) => console.log('observerA: ' + v)});
subscription1.unsubscribe();
 
subscription2 = source.subscribe(v => console.log('observerB: ' + v));
subscription2.unsubscribe();
        
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.1.0/Rx.js"></script>

執行此程式碼段時,我們可以清楚地看到它沒有為 Observer B 發出重複值,實際上它為每個訂閱建立了新的排放量。怎麼會?

在下一次訂閱發生之前,每個訂閱都會被取消訂閱。這有效地使 refCount 減少到零,沒有進行多播。

問題在於 realSource未完成的事實。因為我們不是多播,所以下一個訂戶通過 ReplaySubject 獲得一個新的 realSource 例項,並且新的排放量與之前已經排放的排放量一起被預先新增。