早期版本的 rxjs 中提供了引入 operator 与 add/operator 两种方式
- 直接引入函数本身:
以现有的 JavaScript 语言特性无法进行链式操作,只能够手动嵌套函数调用,影响可读性与可维护性。 - 对 Observable 的原型进行扩展以增加相应方法
由于其类型污染的特性,只能在最终应用中使用而无法应用于类库中。此外,如果采用文件单独引入的方式,则需要增加大量的 import ;如果采用统一引入,则无法保证不引入冗余运算符。
比如你在类库中使用了import 'rxjs/add/operator'的方式引入它,那么别人使用了你的类库,就一定会把这个operator引入进来,而不管有没有实际用到,无法优化,理不清依赖关系,更重要的是,会让使用方自己的代码在依赖了你的类库时,可以找到这个operator(因为被添加到了原型上),但是移除你的类库之后就崩了
引入的新的Lettable Operator方式同时解决了上述的问题,所有的运算符都从 'rxjs/operators' 模块引入,仅仅需要单一的 import 语句,所有运算符作为参数并列,无需进行嵌套:
import { range } from 'rxjs/observable/range'
import { map, filter, scan } from 'rxjs/operators'
const source$ = range(0, 10)
source$.pipe(
filter(x => x % 2 === 0),
map(x => x + x),
scan((acc, x) => acc + x, 0)
)
.subscribe(x => console.log(x))
网友评论