我回顾了以下SO问题: 什么是冷热观测?
总结一下:
一个热的可观察对象发出的值与其订阅无关,即观察者收到的值是订阅时间的函数。 但是,我觉得热还是冷仍然是造成混乱的根源。所以这是我的问题:
默认情况下,所有rx观测值是否都是冷的(主题除外)?
我经常读到事件是热可观察物的典型隐喻,但我也读到事件Rx.fromEvent(input, 'click')是冷可观察物(?)。
Rx.fromEvent(input, 'click')
是否有Rx运算符将冷的可观察物转换为热的可观察物(publish和share除外)?
例如,它如何与Rx运算符一起使用withLatestFrom?让我们cold$在某个地方订阅一个冷的观察。会sth$.withLatestFrom(cold$,...)很热吗?
withLatestFrom
sth$.withLatestFrom(cold$,...)
或者,如果我sth1$.withLatestFrom(cold$,...), sth2$.withLatestFrom(cold$,...)同时订阅sth1和sth2,那么我会始终看到相同的值sth吗?
sth1$.withLatestFrom(cold$,...), sth2$.withLatestFrom(cold$,...)
我以为Rx.fromEvent可以创建冷的可观察物,但事实并非如此,如答案之一所述。但是,我仍然对这种行为感到困惑:https : //codepen.io/anon/pen/NqQMJR? editors =101。不同的订阅从相同的可观察值中获得不同的值。不是click事件共享?
几个月后,我回到了最初的问题,并希望与此同时分享所学到的知识。我将使用以下代码作为说明支持(jsfiddle):
var ta_count = document.getElementById('ta_count'); var ta_result = document.getElementById('ta_result'); var threshold = 3; function emits ( who, who_ ) {return function ( x ) { who.innerHTML = [who.innerHTML, who_ + " emits " + JSON.stringify(x)].join("\n"); };} var messages$ = Rx.Observable.create(function (observer){ var count= 0; setInterval(function(){ observer.onNext(++count); }, 1000) }) .do(emits(ta_count, 'count')) .map(function(count){return count < threshold}) .do(emits(ta_result, 'result')) messages$.subscribe(function(){});
如答案之一所述,定义一个可观察项将导致一系列回调和参数注册。数据流必须插入,并且可以通过subscribe函数来完成。此后可以找到(为说明简化)的详细流程。
默认情况下,可观察值是冷的。订阅可观察者将导致订阅的上游链发生。最后的订阅导致执行函数,该函数将处理源并将其数据发送给其观察者。
该观察者又向下一个观察者发出,导致下游数据流向下到接收器观察者。以下简化图示显示了两个订户订阅同一可观察项时的订阅和数据流。
可以通过使用主题或通过multicast运算符(及其派生形式,请参见下面的注释3)来创建热的可观察物。
在multicast引擎盖下运营商利用一个主题,并返回一个可连接的可观察的。对操作员的所有订阅都将是对内部主题的订阅。当connect被调用时,内部主体所预订的上游观察到的,和数据流下游。主体在内部操作订阅的观察者列表,并将传入的数据多播到所有订阅的观察者。
下图总结了这种情况。
最后,更重要的是要了解由观察者模式和运算符的实现引起的数据流。
例如,如果obs很热,是hotOrCold = obs.op1冷还是热?答案是:
obs
hotOrCold = obs.op1
obs.op1
op1
假设它op1不是一个类似于多播的运算符,则两次hotOrCold订阅将会订阅两次op1,并且来自的每个值obs都会流过两次op1。 注意事项:
hotOrCold
此信息对于Rxjs v4应该有效。尽管版本5进行了相当大的更改,但大多数版本仍保持逐字记录。
Subject type | `Publish` Operator | `Share` operator ------------------ | --------------------------- | ----------------- Rx.Subject | Rx.Observable.publish | share Rx.BehaviorSubject | Rx.Observable.publishValue | shareValue Rx.AsyncSubject | Rx.Observable.publishLast | N/A Rx.ReplaySubject | Rx.Observable.replay | shareReplay