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);
posted @ 2023-03-10 15:34  箫笛  阅读(175)  评论(0编辑  收藏  举报