【发布时间】:2016-07-14 10:04:53
【问题描述】:
我可以从文档中看到:
Cold Observables 从开始到每个 Observer 发出整个值序列。
和
无论观察者何时订阅,ReplaySubject 都会向任何观察者发出源 Observable 发出的所有项目。
那么这两个概念有什么区别呢?
谢谢
【问题讨论】:
标签: javascript rxjs
我可以从文档中看到:
Cold Observables 从开始到每个 Observer 发出整个值序列。
和
无论观察者何时订阅,ReplaySubject 都会向任何观察者发出源 Observable 发出的所有项目。
那么这两个概念有什么区别呢?
谢谢
【问题讨论】:
标签: javascript rxjs
一旦ReplaySubject 订阅了源 observable,源就开始发射,ReplaySubject 成为一个 hot observable。从订阅者的角度来看,订阅 ReplaySubject 可能并不明显,因为它会获取所有先前发出的值。但是ReplaySubject 只订阅源一次,因此主体能够将这些源值重新发送给以后的订阅者的唯一方法是缓存这些值。
因此不同之处在于,当直接订阅源 observable 时,源会为每个订阅者重新发出值,而 ReplaySubject 订阅源时,源只发出一次,任何订阅者都会发送到主题,获取那些缓存的值。
考虑以下可观察的源
var source = Rx.Observable.create(function(subscriber) {
for (var i = 0; i < 2; i++) {
subscriber.onNext(i);
console.log("onNext: " + i);
}
subscriber.onCompleted();
});
如果我们直接订阅源,我们应该会看到两次日志集
source.subscribe(function(value) {});
source.subscribe(function(value) {});
//onNext: 0
//onNext: 1
//onNext: 0
//onNext: 1
使用ReplaySubject,一旦订阅源,源就会开始发射,导致热主题开始发射并缓存值。
var subject = new Rx.ReplaySubject();
source.subscribe(subject);
setTimeout(function() {
console.log('subscribe subject');
subject.subscribe(function(value) { console.log('subscriber')});
subject.subscribe(function(value) { console.log('subscriber')});
}, 100);
//onNext: 0
//onNext: 1
//subscribe subject
//subscriber
//subscriber
//subscriber
//subscriber
在这里,您会看到源在被主题订阅后开始发射。但是对该主题的任何订阅都不会导致源重新发送,就像前面的示例一样,每个新订阅者都会导致源重新发送。
【讨论】:
要进一步详细说明上一个答案,我建议您查看另一个 SO 问题,这应该有助于使事情更清楚:Hot and Cold observables : are there 'hot' and 'cold' operators?
是的,如果我们谈论 replay(),即没有任何参数,重放和冷可观察的行为看起来相似。但是,它们并不相同。
例如,
cold$ = Rx.Observable.just(1).map(function(){return Math.random();});
coldReplay$ = cold$.replay();
cold$.subscribe(function(x){console.log('cold:' + x);})
cold$.subscribe(function(x){console.log('cold:' + x);})
coldReplay$.subscribe(function(x){console.log('replay:' + x);});
coldReplay$.subscribe(function(x){console.log('replay:' + x);});
当您订阅重播和直接订阅冷的 observable 时,永远不会给您相同的值。
为什么从上述链接中应该清楚。当你订阅一个冷的 observable 时,你从第一个源开始到订阅。当你重播时,你不会重新开始,重播将发出的值保存在缓冲区中,并立即直接从缓冲区和新的值传递这些值。
【讨论】: