几个月后,我回到原来的问题,并想同时分享所获得的知识。
我将使用以下代码作为解释支持(jsfiddle http://jsfiddle.net/t0qnp28m/1/):
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)。
The multicast
底层的操作符使用一个主题并返回一个可连接的可观察对象。所有对操作者的订阅都将是对内部主题的订阅。什么时候connect
被调用时,内部主体订阅上游可观察值,数据流向下游。
主题在内部操作订阅观察者的列表,并将传入数据多播到所有订阅的观察者。
下图总结了这种情况。
最后,更重要的是理解观察者模式引起的数据流和操作符的实现。
例如,如果obs
很热,是hotOrCold = obs.op1
冷还是热?不管答案是什么:
- 如果没有订阅者
obs.op1
,没有数据流过op1
。如果有热门订阅者obs
,这意味着obs.op1
可能会丢失一些数据
- 假设
op1
不是一个类似多播的运营商,订阅两次hotOrCold
将订阅两次op1
,以及来自的每个值obs
将流过两次op1
.
Notes :
- 此信息对于 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
Update: 也可以看看以下文章,在这里 https://medium.com/@benlesh/hot-vs-cold-observables-f8094ed53339#.hrv9x5pcr,还有那里 https://medium.com/@benlesh/learning-observable-by-building-observable-d5da57405d87#.4y6cdylm0)关于该主题,作者:Ben Lesh。
有关主题的更多详细信息可以在另一个 SO 问题中找到:不同 RxJS 主题的语义是什么? https://stackoverflow.com/questions/34849873/what-are-the-semantics-of-different-rxjs-subjects