RxJS 系列 – Subject
前言
RxJS 两大概念 Observable 和 Subject. 上一篇介绍了 Observable 这篇继续接受 Subject.
参考
RxJS 建立 Observable 的基礎 - Observable / Subject / BehaviorSubject / ReplaySubject / AsyncSubject
介绍
Subject 是典型的观察者模式, 它不是 Observable 那样参杂了 Generator Function 概念, 所以比较容易理解.
当我们说 Subject extends Observable 时, 指的是它可以被订阅. 而不是它拥有所有 Observable 的特性哦.
和 Observable 不同的地方
第一个不同是它们发布的方式.
Observable 的发布逻辑是在初始化方法里面通过 subscriber.next 发布的.
Subject 没有初始化方法. 它这个对象自带 .next 方法来实现发布
第二个不同是 multiple subscribe
Observable multiple subscribe 会参数多条独立的 stream.
Subjust multiple subscribe 则不会产生多条 stream. 每次 subscurbe 它只是把 callback 函数存起来, 发布时挨个调用而已 (典型的观察者模式实现)
Subject 创建与订阅
const subject = new Subject();
subject.subscribe({
next: () => console.log('next'),
complete: () => console.log('complete'),
});
subject.next('');
subject.complete();
简单明了, 和常见的 addEventListener 一样的逻辑.
BehaviorSubject
stream 是一个值一段时间内的变化.
Subject 只是事件发布. 它表达不了 stream 概念. 于是就有了 BehaviorSubject
const bSubject = new BehaviorSubject<string>('init value');
bSubject.subscribe(value => console.log(value)); // 直接触发拿到 init value
console.log(bSubject.value); // 获取当前 value
bSubject.next('new value'); // update value 同时发布给所有 subscriber
有了 BehaviorSubject 它就像一个可被监听的 variable 了.
ReplaySubject
ReplaySubject 的作用是把 value cache 起来. 当订阅的时候可以直接获取所有 cached values
const rSubject = new ReplaySubject<string>(1); // cache 1 个值, 也可以 cahce 多个
rSubject.next('first value'); // 输入 init value
rSubject.subscribe(v => console.log(v)); // 立刻拿到 init value
rSubject.next('second value'); // 更新 cached value 同时发布
上面这个例子类似于 BehaviorSubject 的功能. 但 BehaviorSubject 可以 .value 获取当前的 value. ReplaySubject 却不能.
所以它替代不了 BehaviorSubject 哦
AsyncSubject
AsyncSubject 我没有用过. 它很特别.
每当 subject.next 的时候它不会发布.
一直到 subject.complete 被调用后, 它才会把最后一个 next value 发布出去
const aSubject = new AsyncSubject<string>();
aSubject.subscribe({
next: v => console.log('next', v), // after .complete() this will be call value is 'b'
});
aSubject.next('a');
aSubject.next('b');
aSubject.complete();
asObservable
Subject 虽然可以被订阅, 但它也具备发布的功能. 如果我们想让它变成 readonly 只能订阅不能发布可以使用 asObservable
const bSubject = new BehaviorSubject<string>('init value');
const value$ = bSubject.asObservable(); // value$ 只能订阅, 不能发布
value$.subscribe(v => console.log(v));
bSubject.next('next value'); // 发布
RxJS 系列 – Subject的更多相关文章
- RxJS之Subject主题 ( Angular环境 )
一 Subject主题 Subject是Observable的子类.- Subject是多播的,允许将值多播给多个观察者.普通的 Observable 是单播的. 在 Subject 的内部,subs ...
- RxJS——主题(Subject)
主题(Subjects) 什么是主题?RxJS 主题就是一个特性类型的 Observable 对象,它允许值多路广播给观察者(Observers).当一个简单的 Observable 是单播的(每个订 ...
- [转]VS Code 扩展 Angular 6 Snippets - TypeScript, Html, Angular Material, ngRx, RxJS & Flex Layout
本文转自:https://marketplace.visualstudio.com/items?itemName=Mikael.Angular-BeastCode VSCode Angular Typ ...
- RxJS v6 学习指南
为什么要使用 RxJS RxJS 是一套处理异步编程的 API,那么我将从异步讲起. 前端编程中的异步有:事件(event).AJAX.动画(animation).定时器(timer). 异步常见的问 ...
- RXJS组件间超越父子关系的相互通信
RXJS组件间超越父子关系的相互通信 用到这个的需求是这样的: 组件A有数据变化,将变化的数据流通知组件B接收这个数据流并做相应的变化 实例化RXJS的subject对象 import { Injec ...
- RxJS——调度器(Scheduler)
调度器 什么是调度器?调度器是当开始订阅时,控制通知推送的.它由三个部分组成. 调度是数据结构.它知道怎样在优先级或其他标准去存储和排队运行的任务 调度器是一个执行上下文.它表示任务在何时何地执行(例 ...
- rxjs笔记(未完成)
首先是 Observable 和promise的区别, 1返回值个数,Observable 可以返回0到无数个值. 2.Promise主动推送,控制着"值"何时被 "推送 ...
- Angular组件——父子组件通讯
Angular组件间通讯 组件树,1号是根组件AppComponent. 组件之间松耦合,组件之间知道的越少越好. 组件4里面点击按钮,触发组件5的初始化逻辑. 传统做法:在按钮4的点击事件里调用组件 ...
- Angular 个人深究(二)【发布与订阅】
Angular 个人深究(二)[发布与订阅] 1. 再入正题之前,首先说明下[ 发布与订阅模式](也叫观察者模式) 1) 定义:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个 ...
- Angular全局数据管理与同步更新
自定义实现angular中数据的状态管理,如有不妥请指正 一.先介绍一下rxjs中subject: Import {subject}from’rxjs’ Subject 数据的订阅与分发,结合报刊的发 ...
随机推荐
- linux信号机制(初识版)
转载 https://www.zhihu.com/question/24913599/answer/2584544572 信号是操作系统内核为我们提供用于在进程间通信的机制,内核可以利用信号来通知进程 ...
- Unity的Package库在IDE里不显示API注释的解决方法
当你在代码里使用Package库的API的时候,比如Addressable和Unity.Entities等等,以Visual Studio为例,鼠标放到API上,会发现不显示注释: 然而按F12访问源 ...
- 史上最详细的Composer安装tp5教程
Composer安装tp5教程1.下载composer先介绍几个网站Composer官网https://getcomposer.org/ Composer中文网http://www.phpcompos ...
- 题解:P10320 勇气(Courage)
P10320 勇气(Courage) 推导过程 本题是一道数学题,重点是如何推导出正确式子. 首先,先特判几个特殊点: 当 \(n>=2\) 且 \(x=2\) 时,是不存在解的,战斗力无论何时 ...
- CF1883B Chemistry 题解
原题传送门 思路: 如"aba","abba"这样的回文字符串, 每个字符的出现次数有以下两种情况: 1:全部是偶数(abba) 2:只有一个为奇数(aba) ...
- mysql 忘记root密码怎么办?
忘记root可以跳过grant table来登录 1.打开命令行输入以下命令 mysqld -nt --grant-skip-tables 2.在打开一个新命令行,输入以下命令可以登录, mysql ...
- python解决urllib发送请求报错:urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:xxxx)>
在使用urllib.request.Request(url)前,添加代码放到最前面 import ssl ssl._create_default_https_context = ssl._create ...
- (六)Redis 消息队列 List、Streams
Redis 适合做消息队列吗?有什么解决方案?首先要明白消息队列的消息存取需求和工作流程. 1.消息队列 我们一般把消息队列中发送消息的组件称为生产者,把接收消息的组件称为消费者,下图是一个通用的消息 ...
- EF Core性能优化技巧
代码层面的优化 1. 使用实例池 EFCore2.0 为DbContext引入新的注册方式:透明地注册了 DbContext实例池,使用这种方式可以避免始终创建新的实例,EF Core 将重置其状态并 ...
- GeoScene Enterprise 3.1 临时许可更新
Portal许可更新 portal 的许可更新很简单,直接打开Portal在线更新就好了 平台管理 -> 许可管理 -> 附加许可 -> 导入许可 -> 选择文件(选择授权的j ...