RxJS Subject 主题 EventEmitter对象 组播Multicast
来源:互联网 发布:网络爬虫 python 编辑:程序博客网 时间:2024/05/18 01:02
Subject主题
什么是Subject?Subject是允许值被多播到多个观察者的一种特殊的Observable。然而纯粹的可观察对象是单播的(每一个订阅的观察者拥有单独的可观察对象的执行)。
Subject就是一个可观察对象,只不过可以被多播至多个观察者。同时Subject也类似于EventEmitter:维护者着众多事件监听器的注册表。
每一个Subject都是一个observable可观察对象,给定一个Subject后,你可以订阅它,提供的观察者将会正常的开始接收值。从观察者的角度来看,它不能判断一个可观察对象的执行时来自于单播的Observable还是来自于一个Subject.
+
在Subject的内部,subscribe并不调用一个新的发送值得执行。它仅仅在观察者注册表中注册给定的观察者,类似于其他库或者语言中的addlistener的工作方式。
每一个Subject都是一个Observer观察者对象。它是一个拥有next()/error()/complete()方法的对象。要想Subject提供一个新的值,只需调用next(),它将会被多播至用来监听Subject的观察者。
综上所述,我们知道Subject既是一个Observable可观察对象,又是一个Observer观察者对象,记住这点是极其重要的。
Subject类似于Node.js中的EventEmitter对象,它是一个事件发射器,例如有一个pop事件,3个observer订阅了它,那么这三个订阅者都会收到EventEmitter对象发射的相同的信息。而在普通的Observable中,它们是独立的,我们甚至可以说Subject是一个特殊的Observable,Subject是Observable的子类。
一个小例子
在此之前我们需要做的第一件事情就是引入RxJS框架。
我这里用的是ts的开发环境,因此我可以以es6的方式引入,如果是Node.js,请参照CommonJS规范进行引入
import * as Rx from 'rxjs/Rx'
下面开始正题
//创建一个Subject对象let subject = new Rx.Subject();//订阅subjectsubject.subscribe(data => console.log(`listener1 : get a data ,the data is ${data}`));subject.subscribe(data => console.log(`listener2 : get a data ,the data is ${data}`));//发射数据subject.next(1);subject.next(2);
output
listener1 : get a data ,the data is 1listener2 : get a data ,the data is 1listener1 : get a data ,the data is 2listener2 : get a data ,the data is 2
在上面我们说了subject既是一个Observable 也是一个 Observer,因此我们还可以将subject当做一个observer传给observable的subscribe方法
//创建一个observablelet observable$ = Rx.Observable.from([1,2,3,4,5]);//创建subjectlet subject = new Rx.Subject();//创建两个observersubject.subscribe(x => console.log(`listener1 : get a data ,the data is ${data}`));subject.subscribe(x => console.log(`listener2 : get a data ,the data is ${data}`));observable$.subscribe(subject);
output:
listener1 : get a data ,the data is 1listener2 : get a data ,the data is 1listener1 : get a data ,the data is 2listener2 : get a data ,the data is 2listener1 : get a data ,the data is 3listener2 : get a data ,the data is 3listener1 : get a data ,the data is 4listener2 : get a data ,the data is 4listener1 : get a data ,the data is 5listener2 : get a data ,the data is 5
将Observable转换为一个multicast(组播)
Multicast实际上是一个拥有connect方法的一个特殊的Observable,下面来看看具体实现
let observable$ = Rx.Observable.from([1,2,3]);//转换为一个Multicastlet multicast$ = observable$.multicast(new Rx.Subject());//添加订阅者let subscription1 = multicast$.subscribe(data => { console.log(data)});let subscription2 = multicast$.subscribe(data => { console.log(data)});//发射数据multicast$.connect();
output:
112233
这里值得一提的是RxJS里的operator(操作符)基本都是纯函数的形式展现的,它们不改变任何状态,不同于原先的命令式编程,multicast操作符就是一个纯函数,它返回一个Observable,实际上是Observable的子类。
总结
除此之外,还有很多种的Subject,这里不再详细的讲解。
- RxJS Subject 主题 EventEmitter对象 组播Multicast
- 组播,multicast
- Multicast 组播
- multicast (组播)
- Multicast :: 组播学习笔记
- 组播Multicast 1 overview
- 组播Multicast 2 PIM
- android multicast 多播(组播)问题
- RxJS 核心概念之Subject
- RxJS 核心概念之Subject
- 华为组播Multicast协议族
- 单播unicast、广播broadcast和组播multicast
- Angular2学习-RxJS核心概念之Subject
- RxJS异步通信之Subject和BehaviorSubject
- 使用Rxjs中的subject发射数据
- 源特定组播(SSM:Source Specific Multicast)
- 跨运营商组播传送案例(multicast-proxy-register应用)
- 组播Multicast 3 PIM的两种模式
- hdu 2098 分拆素数和
- 序列化与反序列化
- shell系统学习一--基本知识
- MySQL单机本地使用XtraBackup备份工具进行备份和恢复(全备+增备+binlog)_(可用)
- hdu 2099 整除的尾数
- RxJS Subject 主题 EventEmitter对象 组播Multicast
- javascript设计模式
- java学习整理20170729
- hdu 1207 汉诺塔II
- 异构数据库支持的字符串拼接
- 关于一些常见格式 tar.gz tar.xz tar tar.bz2等
- 周六日记
- 顺序栈
- C语言 指针入门