为什么Rxjs publishReplay(1).refCount()没有重放?

时间:2017-01-30 18:14:45

标签: javascript rxjs rxjs5

为什么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

2 个答案:

答案 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>