gpt4 book ai didi

javascript - 冷热可观察量 : are there 'hot' and 'cold' operators?

转载 作者:IT王子 更新时间:2023-10-29 02:55:51 27 4
gpt4 key购买 nike

我查看了以下 SO 问题: What are the Hot and Cold observables?

总结:

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

然而,我觉得热与冷仍然是一个困惑的根源。所以这是我的问题:

  • 默认情况下所有 rx observables 都是冷的吗(主体除外)?

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

  • 是否有/有哪些 Rx 运算符可以将冷可观察对象转换为热可观察对象(publishshare 除外)?

    例如,它如何与 Rx 运算符 withLatestFrom 一起工作?让 cold$ 成为一个已在某处订阅的冷可观察对象。 sth$.withLatestFrom(cold$,...) 会成为一个热可观察对象吗?

    或者如果我执行 sth1$.withLatestFrom(cold$,...), sth2$.withLatestFrom(cold$,...) 并订阅 sth1sth2,我总是会看到 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 函数完成的。之后可以找到详细的流程(为便于说明而简化)。

Simplified flow diagram

Observables 默认是冷的。订阅一个可观察对象将导致上游订阅链发生。最后一个订阅导致执行一个函数,该函数将处理一个源并将其数据发送给它的观察者。

该观察者依次向下一个观察者发送数据,从而产生下游数据流,直至接收器观察者。下面的简化图显示了两个订阅者订阅同一个可观察对象时的订阅和数据流。

Cold observable simplified flow diagram

可以通过使用主题或通过 multicast 运算符(及其派生词,请参见下面的注释 3)来创建热可观察对象。

引擎盖下的multicast 运算符使用一个主题并返回一个可连接的可观察对象。所有对运算符的订阅都将是对内部主题的订阅。当 connect 被调用时,内部主体订阅上游可观察对象,数据流向下游。主题在内部操作订阅的观察者列表,并将传入数据多播给所有订阅的观察者。

下图总结了这种情况。

Hot observable simplified flow diagram

最后,更重要的是了解观察者模式引起的数据流和操作符的实现。

例如,如果 obs 是热的,那么 hotOrCold = obs.op1 是冷的还是热的?无论答案是什么:

  • 如果obs.op1 没有订阅者,则没有数据流经op1。如果有热 obs 的订阅者,这意味着 obs.op1 可能会丢失一些数据
  • 假设 op1 不是类似多播的运算符,订阅两次 hotOrCold 将订阅两次 op1,并且来自 obs 将流经 op1 两次。

注释:

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


学科类型 | `Publish` 运算符 | `Share` 运算符
------------------ | -------------------------- | ------------------
Rx.主题 | Rx.Observable.publish | 发布分享
Rx.行为对象 | Rx.Observable.publishValue |分享值(value)
Rx.AsyncSubject | Rx.Observable.publishLast |不适用
Rx.ReplaySubject | Rx.Observable.重播 |分享回放

更新:另见the following articles, here , and there ) 关于 Ben Lesh 的主题。

有关主题的更多详细信息可以在其他 SO 问题中找到:What are the semantics of different RxJS subjects?

关于javascript - 冷热可观察量 : are there 'hot' and 'cold' operators?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32190445/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com