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 数据的订阅与分发,结合报刊的发 ...
随机推荐
- 历代iPad及Android平板的主要参数对比
「程序员的备忘录系列」这笔记可是持续更新的哦 逻辑分辨率Point,也就是CSS像素,是进行网页适配的关键,以下是平时整理的一些备忘录数据,可以收藏. 以现在平板的销量,还没有手机的十分之一, ...
- 解决方案 | Citrix Receiver无法正常启动的多种解决方案
下面是个人在实践过程中总结的解决办法: 方案1:卸载Citrix Receiver(一般通过控制面板卸载,如果正常无法卸载则需要通过官方卸载软件ReceiverCleanupUtility软件卸载), ...
- Git 奇幻之旅⌛️
第一天: 本地仓库 故事的主角是小明,一个刚入门编程的小白.他正在为一个项目写代码,但是他发现每次修改代码都很麻烦,因为他要不断地备份文件,而且很容易弄混版本.有一天,他听说了一个叫 Git 的神奇工 ...
- php.ini文件与php.d
`php.ini` 是 PHP 的主要配置文件,用于全局配置 PHP 的行为和功能.它包含了许多 PHP 的核心设置,如内存限制.错误报告级别.扩展加载等. `php.ini` 文件通常位于 PHP ...
- 搭建lnmp环境-mysql(第五步)
版本mysql 5.7 先删除系统自带的db 新建文件夹/data/download 进入后下载 wget http://repo.mysql.com/mysql57-community-releas ...
- 搭建lnmp环境-nginx关联php-fpm (第三步)
永久关闭防火墙sudo systemctl stop firewalldsudo systemctl disable firewall 有两个防火墙!如果上面那个关闭还不行,就继续关这个后重启. ...
- git操作之一:git add/commit/init
在日常的开发中,适用版本控制系统来进行协同开发已经是工作中的常态,使用比较多的要数git这个工具,今天就来说下git的日常用法以及在开发中的一些疑惑. 一.概述 git在日常开发中广泛应用,其概念可以 ...
- WordPress基础之基本SEO设置
基础内容,不会涉及过深,在谷歌SEO教程中会做详细的介绍,我这里只简单讲下. 1. SEO介绍 SEO,又名搜索引擎优化(Search Engine Optimization,缩写为SEO)是透过了解 ...
- 【MySQL】 批量更改库,表,字段的字符集
库一级的更改: -- 单个库字符集更改 ALTER DATABASE `ymcd_aisw` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; ALTER ...
- 跨平台字幕制作软件ARCTIME
官网:http://arctime.cn/