使用 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
例項,並且新的排放量與之前已經排放的排放量一起被預先新增。