Rxjs: 单播和多播

Rxjs

  • 单播 普通的 Observable 对象是单播的

单播的意思是,每个普通的 Observables 实例都只能被一个观察者订阅,当它被其他观察者订阅的时候会产生一个新的实例。也就是普通 Observables 被不同的观察者订阅的时候,会有多个实例,不管观察者是从何时开始订阅,每个实例都是从头开始把值发给对应的观察者。

  • BehaviorSubject

Subject 其中的一个变体就是 BehaviorSubject,它有一个“当前值”的概念。它保存了发送给消费者的最新值,当有新的观察者订阅时,会立即从 BehaviorSubject 那接收到“当前值”,在定义一个 BehaviorSubject 时需要有初始值, 所以它始终保持有一个最新的值可以发送给后来订阅的 observer。

  • ReplaySubject

类似于 BehaviorSubject,可以发送旧值给新的订阅者,但是不仅是‘当前值’,还可以是之前的旧值。

  • AsyncSubject

只有当 Observable 执行完成时(执行 complete()),它才会将执行的最后一个值发送给观察者。

类似于了 last 运算符,他会等到 Observable 结束的时候将最后一个值发出,如果先前订阅 observer 时该 Observable 对象还没有 complete 的话,那么这个 observer 就不会接收到值,知道 Observable 完结后,才会收到它的最后一个值,如果后订阅的 observer 来到时该 Observable 对象已经完结,那么它就可以 立即 收到这个 observable 发出的最后一个值

  • Cold Observable

Cold Observables 只有被 observers 订阅的时候,才会开始产生值。是单播的,有多少个订阅就会生成多少个订阅实例,每个订阅都是从第一个产生的值开始接收值,所以每个订阅接收到的值都是一样的。

  • Hot Observable

Hot Observables 不管有没有被订阅都会产生值。是多播的,多个订阅共享同一个实例,是从订阅开始接受到值,每个订阅接收到的值是不同的,取决于它们是从什么时候开始订阅。

在这个年纪我还有一整个未来去面对更好的自己,你们也是。

  • refCount 和 connect 的区别

refCount

当使用 refCount,是引用计数的 observable。
它表示当第一个订阅者开始订阅的时候,开始发送和产生值;
第二个订阅者(之后的订阅者)共享第一个订阅者的 Observables 实例,没有订阅者的时候,会自动取消订阅;之后再重新订阅,又从头开始发送值。

connect

当我们调用 ConnectableObservable.prototype.connect 方法,不管有没有被订阅,都会发送值。
订阅者共享同一个实例,订阅者接收到的值取决于它们何时开始订阅。在我们的例子中,第一个订阅等了一秒从 2 开始接受值,第二个订阅等了两秒从 3 开始接受值。

  • 单值:of, empty, never
    of 即使传递的是一个数组,那么他也是将数组作为一个整体的值传递下去

  • 多值:from
    如果传递一个数组/Iterator接口的数据,他会将数组的每一个值依次传递下去

都是将 cold Observable==> hot Observable 不会每次订阅都生成一个新的 observable 对象,可以用来缓存 http 请求的返回值。

  • multicast(new Subject()) / multicast(()=>new Subject()) ---> 实现多播

  • publish
    publish() <==> multicast(new Subject())

hotObservable= coldObservable.publish() .
所以它也需要 hotObservable$去 connect 或者是 refCount

  • share
    share() <===> multicast(() => new Subject()).refCount() 对的

    因为如果它的 multicast 里面是一个工厂函数返回一个新的 Subject 对象的话,那么如果一个 Observable 已经发出值,并且完结,那么后续再次订阅 share 返回的这个 observable 是,就会重新生成一个新的 subject,它还是可以接收到之前的 observable 发出的值,但是如果 multicast 里面是一个单纯的 Subject 实例时,这个实例完结之后再次订阅的 observer 就收不到值了

    缺点就是如果这个 Observable next 了值,那么后续的订阅不会在收到值

  • shareReplay(n) <===> multicast(()=>new Replay(n)).refCount()

    默认保存最后一个值

    可以设置保留的值的数量,如果 Observable 已经返回了值,那么下一次订阅的 Observer 就可以直接使用保留的值,而不会一无所获

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容