当前位置: 首页 > 面试题库 >

冷热观测:是否存在“热”和“冷”运算符?

咸臻
2023-03-14
问题内容

我回顾了以下SO问题: 什么是冷热观测?

总结一下:

  • 当一个冷的可观察对象有一个观察者来消耗它们时,它会发出它的值,即观察者接收到的值的顺序与订阅时间无关。所有观察者将使用相同的值序列。
  • 一个热的可观察对象发出的值与其订阅无关,即观察者收到的值是订阅时间的函数。
    但是,我觉得热还是冷仍然是造成混乱的根源。所以这是我的问题:

  • 默认情况下,所有rx观测值是否都是冷的(主题除外)?

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

  • 是否有Rx运算符将冷的可观察物转换为热的可观察物(publish和share除外)?

  • 例如,它如何与Rx运算符一起使用withLatestFrom?让我们cold$在某个地方订阅一个冷的观察。会sth$.withLatestFrom(cold$,...)很热吗?

  • 或者,如果我sth1$.withLatestFrom(cold$,...), sth2$.withLatestFrom(cold$,...)同时订阅sth1和sth2,那么我会始终看到相同的值sth吗?

  • 我以为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.op1,则不会有数据流过op1。如果有热点用户obs,那obs.op1将可能丢失数据
  • 假设它op1不是一个类似于多播的运算符,则两次hotOrCold订阅将会订阅两次op1,并且来自的每个值obs都会流过两次op1。
    注意事项:

  • 此信息对于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


 类似资料:
  • 本人愚见,我更建议把这个作为序列的属性而不是独立的类型,因为他们表示的抽象概念完美相符,Observable 序列。 这是来自 ReactiveX.io 的定义 一个 Observable 什幺时候开始发生它序列的元素?这依靠 Observable。一个“热的” Observable 一旦创建完了就会发射元素,所以那些之后订阅 Observable 的观察者可以在过程中间开始观察序列。一个“冷的”

  • 另一方面,还有一个热,这更像是一个现场表演。 你从一开始就参加一个现场乐队表演,但有些人可能迟到25分钟的节目。 乐队不会从头开始播放,后来者必须从那里开始观看表演。 在RxJS API中的方法是publish方法。 此方法接受一个冷Observable作为其来源,并返回一个ConnectableObservable的实例。 在这种情况下,我们必须显式调用connect在我们的热Observabl

  • Observable 有冷热两种类型。我们先来看看什么是冷的 observable 。如果是冷的 observable 的话,那么两个订阅者得到值是两份完全相同的副本,示例如下: // 冷的 observable 示例 let stream$ = Rx.Observable.of(1,2,3); //订阅者 1: 1,2,3 stream.subscribe( data => console

  • 我有两个可观察到的。它们都是可观察的类型 一种是冷的,称为初始值可观察(initialValueObservable),它通过可观察(Observable)从项目列表中发出。from()。 另一个是名为“valueUpdateObservable”的热门主题,它是一个发布主题,在出现新项目时通知订阅者。 在客户端中,我想同时订阅这两个,因此我从和发布的更新中获取初始值。我最初的方法是合并它们,但我

  • 本文向大家介绍冷启动和热启动之间的区别,包括了冷启动和热启动之间的区别的使用技巧和注意事项,需要的朋友参考一下 冷启动 冷启动是指在计算机处于关闭状态时通过按电源按钮来启动计算机。最初,初始化微处理器,然后读取ROM,然后启动系统引导过程。 暖启动 热启动是指使用重新启动按钮或使用CTRL + ALT + DELETE键命令组合重新启动系统。当系统停止响应或系统更新要求系统重新启动以使更新生效时,

  • 尝试用代码块c语言编写一个程序: 生成一个从的随机密码,并要求用户猜测该数字 如果用户猜测正确,则打印猜测是正确的 对于第一个猜测,如果它不正确,应该说热 如果用户的猜测越来越接近秘密,则告诉用户他正在变热 如果他的猜测离得更远的话,也可能是冷的 游戏继续,直到猜到密码 我当前的程序在猜测是热还是冷方面给出了错误的输出,也不确定我应该将vs如果有的话,或者在哪里使用 “else if”。如果不是太