前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RxJS 学习系列 16. Subject 的变形, BehaviorSubject, ReplaySubject, AsyncSubject

RxJS 学习系列 16. Subject 的变形, BehaviorSubject, ReplaySubject, AsyncSubject

作者头像
mafeifan
发布于 2019-05-15 06:10:20
发布于 2019-05-15 06:10:20
1.1K00
代码可运行
举报
文章被收录于专栏:finleyMafinleyMa
运行总次数:0
代码可运行
BehaviorSubject

BehaviorSubject 是 Subject 的一个变种,他的特点是会存储当前值,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const subject = new rxjs.Subject();
subject.subscribe((next => {
  console.log(next);
}));
// 打开下面的注释才会输出结果
// subject.next(1);

而 BehaviorSubject 一旦 subscribe 就会执行,可以在定义时要初始化值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const subject = new rxjs.BehaviorSubject(0);
// 会输出 0
subject.subscribe((next => {
  console.log(next);
}));
ReplaySubject

在某些时候我们会希望 Subject 代表事件,但又能在新订阅时重新发送最后的几个元素,这时我们就可以用 ReplaySubject,范例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  const count = 1;
  const subject = new rxjs.ReplaySubject(count);

  var observerA = {
    next: value => console.log('A next: ' + value),
    error: error => console.log('A error: ' + error),
    complete: () => console.log('A complete!')
  }

  var observerB = {
    next: value => console.log('B next: ' + value),
    error: error => console.log('B error: ' + error),
    complete: () => console.log('B complete!')
  }

  subject.subscribe(observerA);
  subject.next(1);
  // "A next: 1"
  subject.next(2);
  // "A next: 2"
  subject.next(3);
  // "A next: 3"

  setTimeout(() => {
    subject.subscribe(observerB);
    // 根据传入 n 的不同
    // "B next: 2"
    // "B next: 3"
  },3000)

ReplaySubject(1) 不等同于 BehaviorSubject,BehaviorSubject 在建立时就会有起始值,比如 BehaviorSubject(0) 起始值就是 0,BehaviorSubject 是代表着状态而 ReplaySubject 只是事件的重放而已。

AsyncSubject

AsyncSubject 是最怪的一个变形,他有点像是 operator last,会在 subject 结束后送出最后一个值,范例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  const subject = new rxjs.AsyncSubject();

  var observerA = {
    next: value  => console.log('A next: ' + value),
    error: error => console.log('A error: ' + error),
    complete: () => console.log('A complete!')
  }

  var observerB = {
    next: value  => console.log('B next: ' + value),
    error: error => console.log('B error: ' + error),
    complete: () => console.log('B complete!')
  }

  subject.subscribe(observerA);
  // 执行 next 并不会输出值
  subject.next(1);
  subject.next(2);
  subject.next(3);
  // 必须执行 complete 才会输出值
  subject.complete();
  setTimeout(() => {
    subject.subscribe(observerB);
    // "B next: 2"
    // "B next: 3"
  },3000)

AsyncSubject 会在 Subject 结束后才送出最后一个值,其实这个行为跟 Promise 很像,都是等到事情结束后送出一个值,实际上我们非常少用到 AsyncSubject,绝大部分的时候都是使用 BehaviorSubject 跟 ReplaySubject 或 Subject。

参考:

https://segmentfault.com/a/1190000005069851 https://ithelp.ithome.com.tw/articles/10188677

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.05.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RxJS Subject
观察者模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。
阿宝哥
2019/11/06
2.3K0
RxJS学习笔记之Subject
总的来说,Subject 既是能够将值多播给多个观察者的特殊的可观察对象,因为可以添加观察者并使用 subscribe 方法来接收值;又是观察者,因为它有 next(v)、error(e)、complete() 方法。下面这段代码很好的说明了每个 Subject 既是 Observable 又是 Observer。
Theo Tsao
2018/09/07
5060
RxJS 入门到搬砖 之 Subscription 和 Subject
什么是 Subscription? Subscription 是一个表示一次性资源的对象,通常是 Observable 的执行。Subscription 有一个重要的方法 unsubscribe,不接受任何参数,只是释放 Subcription 持有的资源。在之前的 RxJS 中,Subscription 被称为 Disposable。
Cellinlab
2023/05/17
1.1K0
【Rxjs】Rxjs_Subject 及其衍生类
在 RxJS 中,Observable 有一些特殊的类,在消息通信中使用比较频繁,下面主要介绍较常用的几个类:
CloudCat
2019/05/26
1K0
RxJS教程
拉取? 由消费者来决定何时从生产者那接收数据,生产者本身不知道数据何时交付到消费者手中的。
全栈程序员站长
2022/06/29
2K0
RxJs简介
这两年,各种异步编程框架,上面RxJava,RxAndroid,RxSwift等等,今天要聊的是RxJs,对于我等入门不久的前端工程师来说,这个框架还是比较有新颖的,中文官网地址:http://cn.rx.js.org/
xiangzhihong
2022/11/30
4K0
RxJS 学习系列 14. Subject 基本概念
终于进到了 RxJS 的第二个重点 Subject,不知道读者们有没有发现? 我们在这篇文章之前的范例,每个 observable 都只订阅了一次,而实际上 observable 是可以多次订阅的
mafeifan
2019/05/15
8890
彻底搞懂RxJS中的Subjects
每周大约有1700万次npm下载,RxJS在JavaScript世界中非常受欢迎。如果您是Angular开发人员,则不会错过RxJS Observables,但您可能对Subjects不太熟悉。虽然它们不像简单的Observable被频繁使用,但还是非常有用的。了解它们将帮助我们编写更好,更简洁的响应式代码。
前端知否
2020/03/23
2.8K0
RxSwift学习笔记之Subject
RxSwift Subject共分为AsyncSubject、BehaviorSubject、PublishSubject、ReplaySubject。
Theo Tsao
2018/09/07
6400
RxJS:给你如丝一般顺滑的编程体验(建议收藏)
怀着对于RxJS这项技术的好奇,笔者花了数天时间研究了这项技术,并肝了一包枸杞才完成这篇文章的撰写,属实不易。不过也正是通过这段时间的学习,我发现这项技术在一定程度上可以解决我在日常业务中遇到的一些痛点,以及有种想马上应用到自己的新项目中的欲望,的确这种以数据流的理念来管控大型项目中的数据能给人带来一种十分优雅的编程体验。
前端达人
2021/01/27
7.7K1
RxJS:给你如丝一般顺滑的编程体验(建议收藏)
RxJS速成 (下)
Subject Subject比较特殊, 它即是Observable又是Observer. 作为Observable, Subject是比较特殊的, 它可以对多个Observer进行广播, 而普通的Observable只能单播, 它有点像EventEmitters(事件发射器), 维护着多个注册的Listeners. 作为Observable, 你可以去订阅它, 提供一个Observer就会正常的收到推送的值. 从Observer的角度是无法分辨出这个Observable是单播的还是一个Subject. 从
solenovex
2018/03/29
2.5K0
RxJS速成 (下)
Rx.js 入门笔记
基本概念 Observable 可观察者, 生产数据 Observer 观察者, 消费数据 Subscription 订阅/可清理对象, 用以清理资源或中断Observeable执行 Subject 多播主体, 向多个订阅者广播数据 Operators 操作符, 处理数据的函数 数据获取方式, 推送/拉取 数据的获取方式,表示了数据生产者和数据消费者之间的通信关系 拉取: 由消费者控制何时获取数据, 例如:请求状态管理器中的状态指 推送: 有生产者控制何时获取数据, 例如:向服务器请求数据 可观察者 Obs
copy_left
2019/08/21
3.1K0
RxJava 的 Subject
在前面一篇文章Cold Observable 和 Hot Observable中,曾经介绍过 Subject 既是 Observable 又是 Observer(Subscriber)。官网称 Subject 可以看成是一个桥梁或者代理。
fengzhizi715
2018/08/24
1.5K0
RxJava  的 Subject
Rxjs 响应式编程-第三章: 构建并发程序
并发是正确有效地同时做几件事的艺术。为了实现这一目标,我们构建我们的程序来利用时间,以最有效的方式一起运行任务。 应用程序中的日常并发示例包括在其他活动发生时保持用户界面响应,有效地处理数百个客户的订单。
frontoldman
2019/09/03
3.9K0
Rxjs 响应式编程-第三章: 构建并发程序
RxJS 学习系列 15. Subject 示例
Subject 实际上就是 Observer Pattern 的实现,他会在内部管理一份 observer 的清单,并在接收到值时遍历这份清单并送出值,所以我们可以直接用 subject 的 next 方法传送值,所有订阅的 observer 就会接收到值了。
mafeifan
2019/05/15
9060
RxJS速成
RxJS是ReactiveX编程理念的JavaScript版本。ReactiveX是一种针对异步数据流的编程。简单来说,它将一切数据,包括HTTP请求,DOM事件或者普通数据等包装成流的形式,然后用强大丰富的操作符对流进行处理,使你能以同步编程的方式处理异步数据,并组合不同的操作符来轻松优雅的实现你所需要的功能
solenovex
2018/03/25
4.7K6
RxJS速成
Rxjs光速入门0. 前言1. Observable2. 产生数据源3. Hot & Cold Observable5. 操作符6. 弹珠图7. Subject总结
Rx指的是响应式编程的实践工具扩展——reactive extension,编程风格是响应式编程+函数式编程。Rxjs则是这种模式的js的实现,处理异步能力优秀,将异步操作抽象为时间轴上的点。既可以当作像lodash那样的工具库来用,也可以用来统一管理数据流,他的出现解决了一些问题:
lhyt
2018/10/31
1K0
Rxjs光速入门0. 前言1. Observable2. 产生数据源3. Hot  & Cold Observable5. 操作符6. 弹珠图7. Subject总结
RxJS & React-Observables 硬核入门指南
Redux-observable是一个基于rxjs的Redux中间件,允许开发者使用异步操作。它是redux-thunk和redux-saga的替代品。
前端修罗场
2022/07/29
7.2K0
RxJS & React-Observables 硬核入门指南
RxJava 中的 Subject测试
PublishSubject Publish是Subject的一个基础子类。发送订阅后的数据流。 PublishSubject<Integer> publishSubject = PublishSubject.create(); BehaviorSubject BehaviorSubject会首先向他的订阅者发送截至订阅前最新的一个数据对象(或初始值),然后正常发送订阅后的数据流。 BehaviorSubject<Integer> behaviorSubject = BehaviorSubject.crea
iOSDevLog
2018/05/17
1K0
【iOS开发】RxSwift中的Subject(PublishSubject/BehaviorSubject/ReplaySubject/Variable)
PublishSubject 即是一个被观察者(Observable)也是一个观察者 (Observer)
吴老师
2018/09/05
1.5K0
【iOS开发】RxSwift中的Subject(PublishSubject/BehaviorSubject/ReplaySubject/Variable)
相关推荐
RxJS Subject
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验