问题在于startWith
和shareReplay
合并得很差。
如果您使用source.startWith(0).shareReplay(1)
,则新订阅将始终以0
开头,shareReplay
无意义,source.shareReplay(1).startWith(0)
稍微好一点,但会导致新订阅收到两个值。
预期:
source ---1---2----3---4----5
ob1 0--1---2----3---4----5
ob2 2--3---4----5
更新:似乎我的最小化案例太小了。我的问题是我使用ob1
从ob2
切换到switch
,这意味着ob1
会在ob2
订阅之前取消订阅。奇怪的是,如果我只使用shareReplay(1)
,它可以正常工作,但startWith(0).shareReplay(1)
的组合却没有。
const main$ = new Rx.Subject()
const s1$ = new Rx.Subject()
// Expected:
// 0 1 2 2 3 4
//const s2$ = s1$.shareReplay(1).startWith(0)
// got:
// 0 1 2 0 2 3 4
//const s2$ = s1$.startWith(0).shareReplay(1)
// got:
// 0 1 2 2 0 3 4
const s2$ = s1$.shareReplay(1)
// got:
// 1 2 2 3 4
main$.switch()
.subscribe(
v => console.log("1: " + v)
)
main$.onNext(s2$)
s1$.onNext(1)
s1$.onNext(2)
main$.onNext(s2$)
s1$.onNext(3)
s1$.onNext(4)
答案 0 :(得分:1)
我无法重现你的问题,我提出了一个jsfiddle:cf。 http://jsfiddle.net/qvb3xbqz/2/。
var counter = 0;
var validation$ = Rx.Observable
.fromEvent(document.getElementById('validation'), 'click')
.map(function(){return ++counter})
.do(emits(ta_validation, 'First subscription'))
.startWith(0)
.shareReplay(1);
setTimeout(function (){
validation$.do(emits(ta_change, 'second subscription')).subscribe(function(){})
}, 1000);
立即订阅一个订阅。第二次订阅在1秒后开始。您将看到它们的行为符合预期。或者我误解了什么?