为什么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
答案 0 :(得分:9)
这是因为当您致电parse
时,a.next(1)
尚未订阅其来源Observable(在此情况下为主题publishReplay(1)
),因此内部{{1}我们没有收到价值a
。
在RxJS 5中,当您在链的末尾订阅时,运算符之间的实际订阅发生在此示例中为ReplaySubject
。参见:
在调用1
之前,运算符被链接,这要归功于b.subscribe(...)
方法,该方法只接受运算符的实例并将其分配给新的Observable。您在上面的两个链接中可以看到的subscribe()
方法稍后在订阅时调用。参见:
答案 1 :(得分:1)
您的第一个订阅者订阅了a
,因为refCount
会在至少有一个订阅者(其中没有订阅者,因为不是b
而是a
时首先激活该流}已订阅),直到你的最后一个位置才会激活。
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>