几个月后,我将回到我最初的问题,并希望在此期间分享所获得的知识.
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
函数完成的.
默认情况下,可观测对象是冷的.订阅可观察对象将导致upstream 订阅链发生.最后一个订阅导致执行一个函数,该函数将处理一个源并将其数据发送给它的观察者.
该观察器依次向下一个观察器emits 数据,从而产生下游数据流,向下到达接收器观察器.下面的简图显示了两个订阅者订阅同一个可观察对象时的订阅和数据流.
热观测可以通过使用对象或通过multicast
运算符(及其导数,见下文注3)创建.
引擎盖下的multicast
操作员使用一个对象并返回一个可连接的可观察对象.对操作员的所有订阅都将是对内部主题的订阅.调用connect
时,内部主体订阅upstream 可观察对象,数据流向下游.
下图总结了这种情况.
最后,更重要的是理解由观察者模式和操作符的实现引起的数据流.
例如,如果obs
是热的,那么hotOrCold = obs.op1
是冷的还是热的?不管答案是什么:
- 如果
obs.op1
没有订户,则不会有数据流经op1
.如果存在HOT obs
的订户,这意味着obs.op1
可能丢失多条数据
- 假设
op1
不是一个类似多播的运营商,向hotOrCold
订阅两次将向op1
订阅两次,来自obs
的每个值将两次流经op1
.
笔记:
- 此信息应对Rxjs v4有效.虽然版本5已经过go 了
经过相当大的变化,其中大部分仍然逐字适用.
- 取消订阅、错误和完成流程不表示为
- 根据用于多播的主题类型,有
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:另见本·莱什(Ben Lesh)关于这一主题的文章.
有关主题的更多详细信息,请参阅另一道SO问题:What are the semantics of different RxJS subjects?