RxJS 可观察对象

一、简介

RxJS 很难,但是在异步数据处理,响应式编程和函数式编程中扮演重要角色。可观察对象是 RxJS 中最为重要的内容,在进入复杂的操作符函数式编程之前,需要充分理解可观察对象 Observable。

可观察对象 Observable 是一个处理异步流数据的重要的部分。它包含了很多的概念:

  • 数据生产者
  • 异步处理
  • 可观察数据序列
  • 可取消
  • 可订阅(可共享)
  • ...

RxJS 有着背后的深厚的思想:观察者模式和迭代器模式,以及函数式编程。

二、实现最简单的可观察对象

ts 复制代码
class   {
    constructor(_subscribeFn) {
        this._subscribeFn = _subscribeFn
    }
    
    subscribe(observer) {
        this._subscribeFn({observer})
  }
}

这里我们实现一个简单的可观察对象,构造函数需要传递一个函数作为参数,实现 subscribe, 然后进行参数传入 _subscribeFn 执行。当然这里是最简单可观察对象,方便理解我们没有实现取消订阅函数。

三、冷可观察对象

  • 独立性的数据序列
  • 新的订阅者发出数据
  • Observable 构造函数/of 等操作符

示例

  • Observable
  • of
  • from
ts 复制代码
import { Observable,of, from } from 'rxjs';

const customObservable = new Observable(observer => {
  observer.next('第一个数据');
  observer.next('第二个数据');
  observer.complete();
});

// 订阅
customObservable.subscribe({
  next: data => console.log('收到数据:', data),
  error: error => console.error('发生错误:', error),
  complete: () => console.log('Observable 完成')
 });

const valuesObservable = of(1, 2, 3, 4, 5);

// 订阅
valuesObservable.subscribe({
  next: data => console.log('收到数据:', data),
  error: error => console.error('发生错误:', error),
  complete: () => console.log('Observable 完成')
 });
 
const arrayObservable = from([1, 2, 3, 4, 5]);

// 订阅
arrayObservable.subscribe({
  next: data => console.log('收到数据:', data),
  error: error => console.error('发生错误:', error),
  complete: () => console.log('Observable 完成')
});

💢💢💢使用可观察对象一定要注意,必要时候一定要取消订阅,避免不必要的内存泄露。

四、热可观察对象

  • 创建数据后发出(与订阅者无关)
  • 新的订阅收到订阅之后发出的数据
  • Subject 主题/formEvent 事件

示例

  • Subject
ts 复制代码
import { Subject } from 'rxjs';

const subject = new Subject();

subject.next('第一个数据');
subject.next('第二个数据');

subject.subscribe(data => console.log('订阅者1收到数据:', data));
subject.next('第三个数据');

subject.subscribe(data => console.log('订阅者2收到数据:', data));
subject.next('第四个数据');
  • fromEvent
ts 复制代码
import { fromEvent } from 'rxjs';

const button = document.getElementById('myButton');
const clickObservable = fromEvent(button, 'click');

clickObservable.subscribe(event => console.log('订阅者1点击了按钮'));
clickObservable.subscribe(event => console.log('订阅者2点击了按钮'));

Subject 也存在一些变体,如 BehaviorSubject 和 ReplaySubject 等等。

五、可观察对象与创建型操作符

创建型可观察对象实现了多种js场景的业务场景,例如如:回调,事件,静态数据,数据请求,判断错误,延迟,定时器等。

操作符 功能
ajax 创建一个 Observable,发起 AJAX 请求并返回相应数据
bindCallback 将一个回调函数转换成 Observable
bindNodeCallback 将一个 Node 风格的回调函数转换成 Observable
defer 延迟 Observable 的创建,直到有订阅者订阅时才执行
empty 创建一个立即完成且不发出任何数据的 Observable
from 将数组、Promise、可迭代对象等转换为 Observable
fromEvent 将 DOM 元素的事件转换为 Observable
fromEventPattern 将符合特定模式的事件转换为 Observable
generate 生成一个基于条件和迭代器的 Observable
interval 创建一个每隔一段时间发出递增数字的 Observable
of 创建一个发出指定值序列的 Observable
range 创建一个发出指定范围内连续整数的 Observable
throwError 创建一个立即抛出错误的 Observable
timer 创建一个在指定时间后发出数据或定期发出数据的 Observable
iif 根据条件选择触发两个不同的 Observable

除去构造函数之外,RxJS 还额外提供了 15 个操作符用于创建可观察对象,方便创建各种可观察对象。

六、小结

本文问主要关注客观对象相关的概念和知识。RxJS 中提供构造函数 Observable 以及多大 15 个操作符用于创建可观察对象。可观察对象是一个数据的生产者,能够处理异步数据,可取消,可观察的数据序列。在 RxJS 可观察对象分为冷热两种类型,冷可观察对象具有独立性,热可观察对象具有共享性。

相关推荐
pengzhuofan2 分钟前
Web开发系列-第0章 Web介绍
前端
小鱼人爱编程11 分钟前
Java基石--反射让你直捣黄龙
前端·spring boot·后端
hqxstudying16 分钟前
J2EE模式---服务层模式
java·数据库·后端·spring·oracle·java-ee
GM_82822 分钟前
【最新最完整】SpringAI-1.0.0开发MCP Server,搭建MCP Client 实战笔记(进阶+详细+完整代码)
java·后端·ai编程·springai·mcp
程序员爱钓鱼41 分钟前
Go语言实战案例-滑动窗口最大值
后端·google·go
Victor3562 小时前
MySQL(163) 如何理解MySQL的隔离级别?
后端
Victor3562 小时前
MySQL(164)如何设置MySQL的隔离级别?
后端
JosieBook2 小时前
【web应用】如何进行前后端调试Debug? + 前端JavaScript调试Debug?
前端·chrome·debug
LBJ辉2 小时前
2. Webpack 高级配置
前端·javascript·webpack
代码老y3 小时前
ASP.NET Core 高并发万字攻防战:架构设计、性能优化与生产实践
后端·性能优化·asp.net