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 数据的订阅与分发,结合报刊的发 ...
随机推荐
- adorner 使用示例
模块介绍 adorner 是一个现代轻量级的 Python 装饰器辅助模块. 目前该模块仅实现了 4 个类,对应着 4 个功能:制造装饰器.执行计时.函数缓存.捕获重试. 仓库地址:https://g ...
- 拥抱未来:GPT-4将如何改变我们的世界
随着人工智能技术的迅猛发展,我们正迎来一个全新的智能时代.在这个时代的前沿,GPT-4作为开拓者和领航者,正在重新定义人机交互.创意创新和个性化服务的标准.无论是在商业领域.教育场景还是科研领域,GP ...
- 用这开源小书学 Docker,香!
> 最新.全面.通俗.可多端阅读的 Docker 教程小书.>> 编程导航开源仓库:https://github.com/liyupi/code-navDocker 可以说是一个改变 ...
- CSP2023
坐标HA 背景 NOIP都打完了,CSP-S都没写游记,所以来补一篇(逃-- 正文 Day 7*-1 考前一周停课集训,被whk老师怒斥不务正业,悲QWQ. Day 0 周五得到年级第一zyx的鼓励, ...
- AT_abc246_d 题解
洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定整数 \(N\),请你找到最小的整数 \(X\),满足: \(X \ge N\). ...
- 使用 useLazyFetch 进行异步数据获取
title: 使用 useLazyFetch 进行异步数据获取 date: 2024/7/20 updated: 2024/7/20 author: cmdragon excerpt: 摘要:&quo ...
- 学习笔记--Java中方法递归调用
Java中方法递归调用 public class RecursionTest01{ public static void main(String[] args){ System.out.println ...
- 【PostgreSQL】下载安装PgSQL
官网下载地址: https://www.enterprisedb.com/downloads/postgres-postgresql-downloads Windows平台 官网直接提供exe安装包, ...
- 【MongoDB】Re02 文档CRUD
三.文档操作(行记录) 不管comment集合是否存在,直接在comment集合中创建一份文档 > db.comment.insert({"articleid":" ...
- 【Git】介绍与概述
版本控制工具应该具备的功能? 协同修改 多人并行不悖的修改服务器端的同一个文件. 数据备份 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态. 版本管理 在保存每一个版本的文件信息的时候 ...