我回顾了以下问题:

总结一下:

  • 当一个冷的可观测对象有一个观察者来消耗它的值时,它就会发出它的值,也就是说,观察者接收到的值的顺序与订阅时间无关.所有观察者都将使用相同的值序列.
  • 热可观察物的emits 值与其订阅无关,即,观察员接收到的值是订阅时间的函数.

然而,我觉得冷与热仍然是困惑的根源.以下是我的问题:

  • 默认情况下,所有的RX观测对象都是冷的吗(对象除外)?

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

  • 是否有/什么样的Rx操作员将冷观测值转换为热观测值(除了publishshare)?

    例如,它如何与Rx操作员withLatestFrom配合使用?假设cold$是一个冷冰冰的可观察物,它已经在某处被订阅了.sth$.withLatestFrom(cold$,...)会是一个热的可观察的物体吗?

    或者,如果我 Select sth1$.withLatestFrom(cold$,...), sth2$.withLatestFrom(cold$,...)并订阅sth1sth2,我会始终看到这两个sth的值相同吗?

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

推荐答案

几个月后,我将回到我最初的问题,并希望在此期间分享所获得的知识.

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

默认情况下,可观测对象是冷的.订阅可观察对象将导致upstream 订阅链发生.最后一个订阅导致执行一个函数,该函数将处理一个源并将其数据发送给它的观察者.

该观察器依次向下一个观察器emits 数据,从而产生下游数据流,向下到达接收器观察器.下面的简图显示了两个订阅者订阅同一个可观察对象时的订阅和数据流.

Cold observable simplified flow diagram

热观测可以通过使用对象或通过multicast运算符(及其导数,见下文注3)创建.

引擎盖下的multicast操作员使用一个对象并返回一个可连接的可观察对象.对操作员的所有订阅都将是对内部主题的订阅.调用connect时,内部主体订阅upstream 可观察对象,数据流向下游.

下图总结了这种情况.

Hot observable simplified flow diagram

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

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

  • 如果obs.op1没有订户,则不会有数据流经op1.如果存在HOT obs的订户,这意味着obs.op1可能丢失多条数据
  • 假设op1不是一个类似多播的运营商,向hotOrCold订阅两次将向op1订阅两次,来自obs的每个值将两次流经op1.

笔记:

  1. 此信息应对Rxjs v4有效.虽然版本5已经过go 了 经过相当大的变化,其中大部分仍然逐字适用.
  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:另见本·莱什(Ben Lesh)关于这一主题的文章.

有关主题的更多详细信息,请参阅另一道SO问题:What are the semantics of different RxJS subjects?

Angular相关问答推荐

RFDC.CommonJS或AMD依赖项可能会导致优化救助ANGURAL PROCEMENT with ngx-charts lib

Angular Signal只指一种类型,但这里用作值.ts(2693)''

元件不工作时的Angular 17属性 Select 器

如何在构造函数中测试MatDialog.Open

第15角Cookie的单元测试用例

如何用ANGLE指令覆盖Html元素的数据绑定属性

将输入传递到组合Angular指令

如何使用解析器处理Angular 路由中存储的查询参数以避免任何额外的导航?

如何将角17中的嵌套组件与独立组件一起使用?

如何在AngularJs中剪断细绳

Observable转换为Observable

从 Angular 应用程序中删除散列标签后无法从 Apache 访问 API

如何以Angular 改变环境

Angular 2 二传手与 ngOnChanges

使用 NPM 安装 Font Awesome 5

如何在Angular2中基于特定的构建环境注入不同的服务?

即使 withCredentials 为真,Angular 也不会发送在 Set-Cookie 中收到的 Cookie

Angular 2:为什么在检索路由参数时使用 switchMap?

在 Angular 组件模板中添加脚本标签

@viewChild 不工作 - 无法读取未定义的属性 nativeElement