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,这里不再详细的讲解。