资讯专栏INFORMATION COLUMN

【Rxjs】Rxjs_Subject 及其衍生类

Coly / 2744人阅读

摘要:实例化一个对象向接受者发送一个消息流接受者订阅消息,获取消息流中的数据接受者订阅消息,获取消息流中的数据这样两路接受者都能拿到发送的数据流是的一个衍生类,它将数据流中的最新值推送给接受者。

Rxjs_Subject 及其衍生类

在 RxJS 中,Observable 有一些特殊的类,在消息通信中使用比较频繁,下面主要介绍较常用的几个类:

1/ Subject

Subject 可以实现一个消息向多个订阅者推送消息。

Subject 是一种特殊类型的 Observable,它允许将值多播给多个观察者,所以 Subject 是多播的,而普通的 Observables 是单播的(每个已订阅的观察者都拥有 Observable 的独立执行)。

每个 Subject 都是观察者。 - Subject 是一个有如下方法的对象: next(v)、error(e) 和 complete() 。要给 Subject 提供新值,只要调用 next(theValue),它会将值多播给已注册监听该 Subject 的观察者们。

var subject = new Rx.Subject(); //实例化一个Subject对象
subject.next(1); //向接受者发送一个消息流
subject.subscribe({
  next: value => console.log("observerA: " + value) //接受者A订阅消息,获取消息流中的数据
});
subject.subscribe({
  next: value => console.log("observerB: " + value) //接受者B订阅消息,获取消息流中的数据
});

这样两路接受者都能拿到发送的数据流:

observerA:1
observerB:1
2/ BehaviorSubject

BehaviorSubject 是 Subject 的一个衍生类,它将数据流中的最新值推送给接受者。

var subject = new Rx.BehaviorSubject(0); //声明一个 BehaviorSubject 对象
subject.next(1); //发送一个数据流
subject.next(2); //再发送一个数据流
subject.subscribe({
  next: v => console.log("observerA: " + v) //接受者 A 订阅消息
});
subject.subscribe({
  next: v => console.log("observerB: " + v) //接受者 B 订阅消息
});
subject.next(3); //再发送一个数据流

这样,每次接受者只会接受最新最送的那个消息:

observerA:2
observerB:2
observerA:3
observerB:3
3/ ReplaySubject

ReplaySubject 类似于 BehaviorSubject,它可以发送旧值给新的订阅者,但它还可以记录 Observable 执行的一部分。

当创建 ReplaySubject 时,你可以指定回放多少个值:

var subject = new Rx.ReplaySubject(3); // 为新的订阅者缓冲3个值

subject.subscribe({
  next: v => console.log("observerA: " + v)
});

subject.next(1);
subject.next(2);
subject.next(3);
subject.next(4);

subject.subscribe({
  next: v => console.log("observerB: " + v)
});

subject.next(5);

输出:

observerA: 1
observerA: 2
observerA: 3
observerA: 4
observerB: 2
observerB: 3
observerB: 4
observerA: 5
observerB: 5
4/ AsyncSubject

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

var subject = new Rx.AsyncSubject();

subject.subscribe({
  next: v => console.log("observerA: " + v)
});

subject.next(1);
subject.next(2);
subject.next(3);
subject.next(4);

subject.subscribe({
  next: v => console.log("observerB: " + v)
});

subject.next(5);
subject.complete();

输出:

observerA: 5
observerB: 5
参考文档

《PublishSubject,ReplaySubject,BehaviorSubject,AsyncSubject》

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/101471.html

相关文章

  • RxJS 核心概念之Subject

    摘要:返回的对象同时是类型的,拥有方法。由于调用后,开始执行,因此,会返回一个供调用者来终止执行。是的一个衍生类,具有最新的值的概念。举一个形象的例子,表示一个人的生日,而则表示一个人的岁数。 什么是Subject? 在RxJS中,Subject是一类特殊的Observable,它可以向多个Observer多路推送数值。普通的Observable并不具备多路推送的能力(每一个Observer...

    weij 评论0 收藏0
  • 使用RxJS管理React应用状态的实践分享

    摘要:随着前端应用的复杂度越来越高,如何管理应用的数据已经是一个不可回避的问题。应用的数据不是只有状态的,还有事件异步常量等等。出于以上两点原因,最终决定基于来设计一套管理应用的状态的解决方案。 随着前端应用的复杂度越来越高,如何管理应用的数据已经是一个不可回避的问题。当你面对的是业务场景复杂、需求变动频繁、各种应用数据互相关联依赖的大型前端应用时,你会如何去管理应用的状态数据呢? 我们认为...

    KunMinX 评论0 收藏0
  • Set & Map:新生的数据集合及其弱引用衍生

    摘要:前言新增了两种基本的原生数据集合和加上和现在共有四种,以及由两者衍生出的弱引用集合和。其本身是生成实例数据集合的构造函数,可以接受一个数组或具有接口的数据结构作为参数用来初始化。返回键值对的遍历器对象,键值对为键名键值。 前言 ES6新增了两种基本的原生数据集合:Set和Map(加上Array和Object现在共有四种),以及由两者衍生出的弱引用集合:WeakSet和WeakMap。从...

    AprilJ 评论0 收藏0
  • [译]RxJS06——Subject

    摘要:举例来说,每年都有生日是一道数据流,但是一个人的年龄却是一个流。运行结果显示,第二个在订阅之后,获得了数据流中最后毫秒事件内产生的和三个值。 原文:http://reactivex.io/rxjs/manu... Subject是什么? RxJS的Subject是Observable的一个特殊类型,他可以将流中的值广播给众多观察者(Observer)。一般的Observalbe流是单一...

    gitmilk 评论0 收藏0

发表评论

0条评论

Coly

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<