Cold Observable和Replay主题之间的区别?

时间:2016-03-26 20:21:49

标签: javascript rxjs

我可以从文档中看到:

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

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

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

由于

2 个答案:

答案 0 :(得分:8)

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

在这里,您会看到一旦主题订阅,源就会开始发光。但是对主题的任何订阅都不会导致源重新发出,就像前面的示例所示,每个新订阅者都会重新发出源。

答案 1 :(得分:2)

为了进一步详细说明上一个答案,我建议你看看另一个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);});
订阅重播时以及直接订阅冷可观察数时,

永远不会给你相同的值。

为什么从上述链接中可以清楚地看出这一点。订阅cold observable时,从第一个源开始到订阅。当你重放时,你不会重新启动,重放会在缓冲区中保存已发出的值,并直接从缓冲区和新缓冲区中直接传递这些值。