冷 Observable 和 Replay Subject 有什么区别?

12

我可以从文档中看出:

Cold Observables 从开头开始向每个 Observer 发出整个值序列。

ReplaySubject 向任何观察者发出源 Observable 所发出的所有项目,而不管观察者何时订阅。

那么这两个概念有什么区别呢?

谢谢


请观看以下视频之一:https://egghead.io/lessons/rxjs-demystifying-cold-and-hot-observables-in-rxjs 或 https://channel9.msdn.com/Blogs/J.Van.Gogh/Rx-API-in-depth-Hot-and-Cold-observables。 - xgrommx
2个回答

14
一旦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

在这里,您可以看到源一旦被主题订阅,就开始发出信号。但是任何对主题的订阅并不会导致源重新发出信号,就像之前的示例中每个新的订阅者都会导致源重新发出信号一样。


5
进一步阐述之前的答案,我建议您查看另一个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);});

订阅回放和直接订阅冷可观察对象时,其返回的值永远不会相同。这是因为当您订阅冷可观察对象时,您从第一个源开始一直到订阅。当您进行回放时,不会重新启动,回放已将发出的值保留在缓冲区中,并立即从缓冲区传递这些值和新值。请参考上述链接以了解更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接