繁体   English   中英

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

[英]Difference between Cold observable and Replay subject?

我可以从文档中看到:

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

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

为了进一步详细说明之前的答案,我建议你看看另一个SO问题,它应该有助于使事情变得更加清晰: 热和冷的观察:有“热”和“冷”运算符吗?

是的,如果我们谈论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时,从第一个源开始到订阅。 重放时,不重新启动,重放会在缓冲区中保留已发出的值,并直接从缓冲区和新缓冲区中直接传递这些值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM