我可以从文档中看出:
Cold Observables 从开头开始向每个 Observer 发出整个值序列。
和
ReplaySubject 向任何观察者发出源 Observable 所发出的所有项目,而不管观察者何时订阅。
那么这两个概念有什么区别呢?
谢谢
我可以从文档中看出:
Cold Observables 从开头开始向每个 Observer 发出整个值序列。
和
ReplaySubject 向任何观察者发出源 Observable 所发出的所有项目,而不管观察者何时订阅。
那么这两个概念有什么区别呢?
谢谢
ReplaySubject
订阅源可观测对象,源开始发出数据,ReplaySubject
成为热可观测对象。对于订阅者而言,订阅ReplaySubject
时可能不太明显,因为它获取了所有之前发出的值。但是ReplaySubject
仅订阅一次源,所以主题能够将这些源值重新发射给后来的订阅者的唯一方法是缓存这些值。
因此,与直接订阅源可观测对象不同,在订阅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
在这里,您可以看到源一旦被主题订阅,就开始发出信号。但是任何对主题的订阅并不会导致源重新发出信号,就像之前的示例中每个新的订阅者都会导致源重新发出信号一样。
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);});