Rxjs编程系列-操作符
定义: 一个操作符是返回一个Observable对象的函数,不过,有的操作符是根据其他Observable对象产生返回
的Observable对象,有的操作符则是利用其他类型输入产生返回的Observable对象,还有一些操作符不需要输入
就可以凭空创造一个Observable对象。
1. 操作符分类
按功能分类
- 创建类
- 转化类
- 过滤类
- 合并类
- 多播类
- 错误处理类
- 辅助工具类
- 条件分支类
- 数学和合计类
按特性分类
- 背压控制类
- 可连接类
- 高阶Observable处理类
按挂载方式分类
- 静态方法类
- 实例方法类
2. 实现操作符
实现一个操作符需要考虑下面这些功能要点:
- 返回一个全新的Observable对象
function map(project){
return new Observable(observer => {
this.subscribe({
next: value => observer.next(project(value)),
error: error => observer.error(error),
complete: () => observer.complete()
});
});
}
- 对上游和下游的订阅及退订处理
function map(project){
return new Observable(observer => {
const sub = this.subscribe({
next: value => observer.next(project(value)),
error: error => observer.error(error),
complete: () => observer.complete()
});
return {
unsubscribe: () => {
sub.unsubscribe();
}
};
});
}
- 处理异常情况
function map(project){
return new Observable(observer => {
const sub = this.subscribe({
next: value => {
try {
observer.next(project(value)),
} catch(error){
observer.error(error);
}
},
error: error => observer.error(error),
complete: () => observer.complete()
});
return {
unsubscribe: () => {
sub.unsubscribe();
}
};
});
}
- 及时释放资源
3. lettable/pipeable 操作符
- let 操作符
let的参数是一个函数$double,此函数返回一个Observable对象,$double函数同样接受一个Observable对象作为
参数,因此let擦作符接受的就是一个以Observable对象作为参数并返回Observable对象的函数。
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/let';
const source$ = Observable.of(1, 2, 3);
const double$ = obs$ => obs$.map(x => x * 2);
const result$ = source$.let(double$);
result$.subscribe(console.log);
纯函数实现map操作符
function map(project){
return function(obs$) {
return new Observable(observer => {
return obs$.subscribe({
next: value => observer.next(project(value)),
error: error => observer.error(error),
complete: () => observer.complete()
});
});
}
}
- pipeable操作符
凡事能够被let作为参数来使用的操作符实现方式就叫做lettable操作符,也叫pipeable操作符。
let操作符和pipe操作符功能相同,建议使用pipe操作符。
使用pipe操作符
import {Observable} from 'rxjs/Observable';
import {of} 'rxjs/observable/of';
import {map, filter} 'rxjs/operators';
const source$ = of(1, 2, 3);
const result$ = source$.pipe(
filter(x => x % 2 === 0),
map(x => x * 2)
);
result$.subscribe(console.log);
使用let操作符
import {Observable} from 'rxjs/Observable';
import {of} 'rxjs/observable/of';
import {map, filter} 'rxjs/operators';
import 'rxjs/add/operator/let';
const source$ = of(1, 2, 3);
const result$ = source$
.let(filter(x => x % 2 === 0))
.let(map(x => x * 2));
result$.subscribe(console.log);