Agular 中的 RxJS 之 数据流和操作符

172 阅读3分钟

「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

前言

在上一篇文章当中,我们介绍了 SubjectBehaviorSubject 以及 ReplaySubject,他们都是用来创建一个空的可观察对象的,并且传播数据的方式不再是通过订阅,而是利用类似于广播的方式进行传输数据,在 next 方法调用时候就会去发出广播。

Agular 中的 RxJS 之 Subject - 掘金 (juejin.cn)

但是它们创建的细节方面又有所不同,所以可以根据相应的场景选择需要的构造方法去进行创建。

接下去会介绍到 RxJS 的另外两个概念,分别是数据流和操作符,今天的这篇文章主要要来讲解一下它们两是什么,并且借用一些辅助方法做一个介绍。

什么是数据流和操作符

  1. 数据流 : 从可观察对象内部流出的数据叫做数据流,可观察对象可以向外部源源不断的输出数据

  2. 操作符 : 本质就是一堆方法,用于操作数据流,可以对数据流对象进行转换过滤等等操作

在了解了数据流和操作符之后,接下去会使用一些代码来感受一下什么是数据流,什么是操作符

辅助方法

在之前我们都是通过构造函数的方式来创建可观察对象,但是在 RxJS 中,也提供给了我们一些方法,这些方法在调用之后就会返回 observable 对象。

数据流 range -- 发出范围内的数字序列

range 方法,调用之后会返回一个 observable 对象,并且订阅之后会发出指定范围的数据。

语法:range(start,length)

参数:

  • start: 表示从哪一个数值开始

  • length: 表示发出多少个数值

让我们用图来做一个例子,下面的 range 方法会输出一串数据:

image.png

然后在实际代码中,我们也能够从 RxJS 去引入这个方法:

import { range } from "rxjs"

range(1,3).subscribe(n=>console.log(n))

// 输出
1
2
3
4

上面这样从一个 observable 不断传出的数据,我们就称为数据流

操作符 map -- 基于原有值对数据流进行转化

这个操作符 map 和 js 中的 map 方法十分的相似,都是通过一个函数来对一些数据进行操作,可以定义一个函数来对它们进行统一的操作。

下面用一张图来理解一下 map 操作符:

image.png

可以看到 map 操作符对一串数据流进行了一个操作,这样输出的数据流就会统一发生改变,这和 map 函数十分的相似。

下面也是用实际的代码来看一下 map 操作符要怎么去使用:

import { map } from 'rxjs/operators'
import { range } from 'rxjs'

range(1,4).pipe(
    map(n => n*2)
).subscribe(n=>console.log(n))

// 输出
2
4
6
8

要注意 map 操作符在引用的时候和 range 不同,我们要从 RxJS 下的 操作符 中去引入。

总结

本篇文章介绍了 RxJS 中的数据流和操作符的概念,并且利用两个简单的辅助方法实际的去展示了一下什么是数据流,什么是操作符,总体来说数据流就是从可观察对象中向外流出来的数据,而操作符就是可以去对它进行一个额外的操作。

在接下去的文章当中,我们会继续去介绍 RxJS 中一些其他的辅助方法以及实际的使用dome。