重学 Rxjs —— 自定义操作符

466 阅读2分钟

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

这一节来看一下自定义操作符相关内容。前面学习过各种各样的操作符,使用这些操作符基本上可以满足大部分需求,但是实际开发中还有一些特殊情况,比如我们可能经常一起使用几个操作符,每次都重复写一遍很不方便,还有的时候我们可能需要基于自身需求创造新的定制操作符,在这些场景下就需要使用自定义操作符的能力。

自从引入了 pipe 之后,自定义操作符实际上就是写一个函数,这个函数需要返回一个处理函数,处理函数即满足接收一个 Observable,返回一个 Observable 的函数,使用函数签名描述为:<T, R>(source: Observable) => Observable。

举个例子,我们来实现一个计算平方的操作符:

const square = () => {
	return source => {
		return source.pipe(map((value: number) => value * value));
	};
}

之后我们就可以像普通操作符一样使用了:

of(1, 2, 3).pipe(square()).subscribe((v) => console.log(v));
// 1
// 4
// 9

这个例子很简单,从这里可以看到,所谓的自定义操作符其实也没有什么特别的地方,无非就是封装一个符合规范的函数。曾经还有使用 lift 编写操作符的写法,不过在最新版本 Rxjs 已经没有了,现在自定义操作符都是基于 pipe 的这样的操作符很容易理解。

定义操作符时候需要注意资源都要释放掉,还需要注意异常处理。在上面的例子中,我们计算一个数字的平方,如果传入的不是一个数字,我们要进行异常处理,可以抛出一个错误,因为操作符是一个通用的能力,因此相关的处理需要严谨一些,避免各种形式的异常和资源泄露。

自定义操作符的内容比较少,在实际开发中根据需要来定制,并 Rxjs 非必备能力。