热和冷可观察量:是否存在“热”和“冷”运算符?

2024-01-31

我回顾了以下SO问题:什么是热观测值和冷观测值? https://stackoverflow.com/questions/2521277/what-are-the-hot-and-cold-observables

总结一下:

  • 冷可观察对象在有观察者使用它们时发出其值,即观察者接收到的值的顺序与订阅时间无关。所有观察者都将使用相同的值序列。
  • 热可观察对象发出的值与其订阅无关,即观察者收到的值是订阅时间的函数。

然而,我觉得热与冷仍然是一个混乱的根源。这是我的问题:

  • 默认情况下所有 rx 可观察量都是冷的吗(受试者除外)?

    我经常读到事件是热可观察量的典型隐喻,但我也读到Rx.fromEvent(input, 'click')是冷可观察的(?)。

  • 是否有/哪些 Rx 运算符可以将冷可观察量转变为热可观察量(除了publish, and share)?

    例如,它如何与 Rx 操作符一起工作withLatestFrom? Let cold$是一个已在某处订阅的冷可观察值。将要sth$.withLatestFrom(cold$,...)是一个热可观测值吗?

    或者如果我这样做sth1$.withLatestFrom(cold$,...), sth2$.withLatestFrom(cold$,...)并订阅sth1 and sth2,我是否总是会看到两者具有相同的值sth?

  • 我想Rx.fromEvent创建冷可观察量,但事实并非如此,正如其中一个答案中提到的。然而,我仍然对这种行为感到困惑:https://codepen.io/anon/pen/NqQMJR?editors=101 https://codepen.io/anon/pen/NqQMJR?editors=101。不同的订阅从同一个可观察值中获得不同的值。不是吗click事件共享?


几个月后,我回到原来的问题,并想同时分享所获得的知识。 我将使用以下代码作为解释支持(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 :

  1. 此信息对于 Rxjs v4 应该有效。虽然版本 5 已经消失 经过相当大的修改,其中大部分仍然逐字适用。
  2. 未表示取消订阅、错误和完成流程,如下所示 它们不在问题的范围之内。调度程序也不是 考虑到。除其他外,它们影响时间 数据流,但先验不是其方向和内容。
  3. 根据组播的主题类型,有 不同的派生多播运算符:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

热和冷可观察量:是否存在“热”和“冷”运算符? 的相关文章

随机推荐