当前位置:网站首页>rxjs Observable 自定义 Operator 的开发技巧
rxjs Observable 自定义 Operator 的开发技巧
2022-07-02 18:38:00 【汪子熙】
操作符是 RxJS 库和 Observables 的基础块。 它使我们能够通过使用一些关键字(函数)来执行复杂的操作。 运算符只不过是获取源 Observable、对其执行操作并返回新 Observable 的函数。
rxJS 的 管道运算符 pipe 允许我们链接运算符。每个运算符都接受一个 Observable 并返回一个 Observable,这种一致的行为使得链接成为了可能。 Operator 返回的 Observable 作为下一个运算符的输入。
下面是一个最简单的自定义 Operator 的例子。
import {
interval, of } from 'rxjs';
function fancyOperator(source) {
return source;
}
interval(1000)
.pipe(fancyOperator)
.subscribe((value) => console.log(value));
pipe 调用并不会真正执行 Operator 函数体的逻辑,直至 Observable 被 subscribe 为止??是这样吗?

pipeFromArray 仅仅取出 Operation 数组里存储的第一个函数。
然后调用之,输入参数 this 就是源 Observable.

下面我们对 fancyOperator 添加少许功能。
import {
interval, Observable } from 'rxjs';
function fancyOperator(source) {
return Observable.create((observer) => {
observer.next('Jerry');
observer.complete();
});
}
interval(1000)
.pipe(fancyOperator)
.subscribe((value) => console.log(value));
这里我们采取了移花接木的方法,在自定义 Operator 里返回了一个新的 Observable,这个 Observable 只发射一次数据,就进入终止状态。

看一个现实项目中自定义 Observable 的例子:
import {
fromEvent, interval, Observable } from 'rxjs';
import {
filter } from 'rxjs/operators';
function filterKey(key) {
return filter((event: KeyboardEvent) => event.key === key);
}
fromEvent(document, 'keyup')
.pipe(filterKey('Enter'))
.subscribe(
(data) => console.log(data) // KeyboardEvent
);
这个自定义 Operator 的输入是 Enter,输出是 filter 调用的返回值,一个新的函数。filter 调用接收一个 predicate,返回一个新的函数。

看一下 filter 返回函数运行时打印的值:

把原始的 Observable,传送给 filter 返回的函数并执行:

filter 返回的函数对原始 Observable 进行加工,返回一个新的 Observable:
触发 filterOperator 的构造函数:

把新建的 filterOperator 实例传入原始 Observable 的 lift 方法。这个 lift 操作非常简单,新建一个 Observable,把原始的 Observable挂接到新的 Observable 的 source 字段,同时把 Operator 实例赋给新的 Observable 实例的 operator 方法。

因此最后订阅时,订阅的是 lift 操作之后的新的 Observable 实例。
subscribe 会触发 filterOperator 的 call 方法:


边栏推荐
- SIFT特征点提取「建议收藏」
- Reading notes of code neatness
- Reduce -- traverse element calculation. The specific calculation formula needs to be passed in and combined with BigDecimal
- Understanding and function of polymorphism
- 横向越权与纵向越权[通俗易懂]
- MySQL高级(进阶)SQL语句
- 【pytorch学习笔记】Tensor
- 使用xml文件打印mybaties-log插件的方式
- AcWing 181. 回转游戏 题解(搜索—IDA*搜索)
- mybatiesHelperPro工具必须的可以生成到对应项目文件夹下
猜你喜欢

高级性能测试系列《24. 通过jdbc执行sql脚本》

AcWing 340. 通信线路 题解(二分+双端队列BFS求最短路)

Why should we build an enterprise fixed asset management system and how can enterprises strengthen fixed asset management

Py之interpret:interpret的简介、安装、案例应用之详细攻略

IDEA编辑器去掉sql语句背景颜色SQL语句警告No data sources are configured to run this SQL...和SQL Dialect is Not Config

Thread application instance

Web2.0 giants have deployed VC, and tiger Dao VC may become a shortcut to Web3
Bubble sort array

Web2.0 giants have deployed VC, and tiger Dao VC may become a shortcut to Web3

Windows2008R2 安装 PHP7.4.30 必须 LocalSystem 启动应用程序池 不然500错误 FastCGI 进程意外退出
随机推荐
AcWing 1134. Shortest circuit counting problem solution (shortest circuit)
R语言使用econocharts包创建微观经济或宏观经济图、indifference函数可视化无差异曲线(indifference curve)
Codeworks round 802 (Div. 2) pure supplementary questions
嵌入式(PLD) 系列,EPF10K50RC240-3N 可编程逻辑器件
PHP非对称加密方法私钥及公钥加密解密的方法
451-memcpy、memmove、memset的实现
AcWing 340. 通信线路 题解(二分+双端队列BFS求最短路)
A4988 drive stepper motor "recommended collection"
AcWing 1126. 最小花费 题解(最短路—dijkstra)
Zabbix5 client installation and configuration
Virtual machine initialization script, virtual machine mutual secret key free
PHP parser badminton reservation applet development requires online system
MySQL
Golang:[]byte to string
SQLite 3.39.0 发布,支持右外连接和全外连接
使用xml文件打印mybaties-log插件的方式
AcWing 1131. Saving Private Ryan (the shortest way)
mysql备份后缀是什么_mysql备份还原
AcWing 1129. 热浪 题解(最短路—spfa)
metric_ Logger urination