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

lua*_*ped 5 javascript rxjs

我可以从文档中看到:

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

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

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

谢谢

Pau*_*tha 8

一旦ReplaySubject订阅了源可观察源,源就开始发射,并ReplaySubject成为一个热的可观察者.从订阅者的角度来看,订阅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();
});
Run Code Online (Sandbox Code Playgroud)

如果我们直接订阅源代码,我们应该看两次日志集

source.subscribe(function(value) {});
source.subscribe(function(value) {});
//onNext: 0
//onNext: 1
//onNext: 0
//onNext: 1
Run Code Online (Sandbox Code Playgroud)

有了它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
Run Code Online (Sandbox Code Playgroud)

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


use*_*222 5

为了进一步详细说明前面的答案,我建议您看一下另一个 SO 问题,这应该有助于使事情变得更清楚:热和冷可观察量:是否有“热”和“冷”运算符?

是的,如果我们谈论 a 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);});
Run Code Online (Sandbox Code Playgroud)

当您订阅重播和直接订阅冷可观察时,永远不会给您相同的值。

从上述链接中应该可以清楚地了解为什么会这样。当您订阅冷可观察对象时,您从第一个源开始进行订阅。重播时,无需重新启动,重播已将发出的值保存在缓冲区中,并立即直接传递缓冲区中的这些值和新值。