Javascript 冷可观察对象和重放对象之间的区别?

Javascript 冷可观察对象和重放对象之间的区别?,javascript,rxjs,Javascript,Rxjs,我可以从文件中看到: 冷观测从开始到每个观测者发射整个值序列 及 ReplaySubject向任何观察者发射源可观察对象发射的所有项,而不管观察者何时订阅 那么这两个概念之间的区别是什么呢 谢谢一旦ReplaySubject订阅了源可观测对象,源开始发射,并且ReplaySubject成为热可观测对象。从订阅者的角度来看,订阅ReplaySubject它可能并不明显,因为它会获取以前发出的所有值。但是,ReplaySubject只订阅源一次,因此主体能够将这些源值重新发送给以后的订阅方的唯一方法

我可以从文件中看到:

冷观测从开始到每个观测者发射整个值序列

ReplaySubject向任何观察者发射源可观察对象发射的所有项,而不管观察者何时订阅

那么这两个概念之间的区别是什么呢


谢谢

一旦
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();
});
使用
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()
,也就是说,没有任何参数,那么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);});
当您订阅replay和直接订阅cold observable时,将永远不会给出相同的值

从前面提到的链接中可以清楚地看到这一点。当你订阅一个冷的可观测对象时,你从第一个源开始,一直到订阅。当您重播时,您不会重新启动,重播会将发出的值保存在缓冲区中,并立即将这些值从缓冲区和新值中直接传递出去。

请观看此视频或此视频
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);});