RxJS Subject 主题 EventEmitter对象 组播Multicast

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();
//订阅subject
subject.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 1
listener2 : get a data ,the data is 1
listener1 : get a data ,the data is 2
listener2 : get a data ,the data is 2

在上面我们说了subject既是一个Observable 也是一个 Observer,因此我们还可以将subject当做一个observer传给observable的subscribe方法

//创建一个observable
let observable$ = Rx.Observable.from([1,2,3,4,5]);
//创建subject
let subject = new Rx.Subject();
//创建两个observer
subject.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 1
listener2 : get a data ,the data is 1
listener1 : get a data ,the data is 2
listener2 : get a data ,the data is 2
listener1 : get a data ,the data is 3
listener2 : get a data ,the data is 3
listener1 : get a data ,the data is 4
listener2 : get a data ,the data is 4
listener1 : get a data ,the data is 5
listener2 : get a data ,the data is 5

将Observable转换为一个multicast(组播)

Multicast实际上是一个拥有connect方法的一个特殊的Observable,下面来看看具体实现

let observable$ = Rx.Observable.from([1,2,3]);
//转换为一个Multicast
let 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:

1
1
2
2
3
3

这里值得一提的是RxJS里的operator(操作符)基本都是纯函数的形式展现的,它们不改变任何状态,不同于原先的命令式编程,multicast操作符就是一个纯函数,它返回一个Observable,实际上是Observable的子类。

总结

除此之外,还有很多种的Subject,这里不再详细的讲解。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值