RxJS 6入门

RxJS,the ReactiveX library for JavaScript
RxJS官网

1 Rxjs用到的设计模式

  • 观察者模式(Observer pattern)
  • 迭代器模式(Iterator pattern)
  • 函数编程与集合等设计模式

主要目的:有效管理非同步环境下的事件资料
RxJS是一组用来处理非同步事件的JavaScript函式库

非同步
  • AJAX / XHR / Fetch
  • Service Worker / Node Stream
  • setTimeout / setInterval
  • Promise
事件
  • 各式DOM事件(click、dblclick、keyup、mousemove)
  • CSS动画事件(CSS3 transitionEnd event)
  • HTML5 Geolocation / WebSockets / Server Send Event

2 RxJS的核心概念

Observable 可观察的物件
Observer 观察者物件
  • 代表一个用来接收【观察结果】的物件(收到的就是事件资料)
  • 观察者物件就是一个物件包含3个含有回呼函式的属性(next、error、complete)
Subscription 订阅物件
  • 代表正在执行 Observable / Observer 的执行个体(可用来取消订阅)
Operators 运算子
  • 必须拥有函数编程中所定义的纯函数特性(没有副作用的函式)
  • 必须用来处理一系列的事件资料集合
  • 常见的运算子包含map、filter、concat、flatMap、switchMap https://reactive.how/
Subject 主体物件
  • 如同 EventEmitter 一样,主要用来广播收到的事件资料给多位 Observer(观察者)
Schedulers 排程控制器
  • 用来集中管理与调度多重事件之间的资料,以控制事件并发情况
import {
    
     Subject } from 'rxjs';
import {
    
     throttleTime } from 'rxjs/operators';

export class CreateBackupComponent implements OnInit {
    
    
    clickOne = new Subject;
    ngOnInit() {
    
    
        this.clickOne.pipe(throttleTime(500)).subscribe((params) => {
    
    
            this.saveData(params);
        })
    }
    saveData(params) {
    
    
        const {
    
     id, name} = params;
        ...
    }

    okButton: {
    
    
        'click': () => {
    
    
          message.close();
          this.clickOne.next({
    
     id: newsId, name: newsName });
        }
    }
}

// 点击button,执行click事件:this.clickOne.next()
// 执行this.clickOne.next(),相当于执行this.saveData()事件
// this.clickOne.next()传入的参数{ id: newsId, name: newsName },就是this.saveData()中的参数;
// 最终结果:连续点击click,每500毫秒只执行一次saveData事件

3 RxJS的运作方式

interval:rxjs的内置函数;
interval(500):每500毫秒发送一个数字,从0开始;
pipe:将每500毫秒送出的事件资料讲给take进行处理;
take(4):只取前面4笔;
subscribe:订阅者,subscribe()中的就是订阅者observer

rxjs.interval(500).pipe(rxjs.operators.take(4)).subscribe(console.log)
0
1
2
3
// interval:建立运算子,建立observable物件
// pipe:过滤运算子
// console.log:观察者
// 解构
import {
    
     interval } from 'rxjs';
import {
    
     take } from 'rxjs.operators';
interval(500).pipe(take(4)).subscribe(console.log)
const subs = rxjs.interval(500).pipe(rxjs.operators.take(40)).subscribe(console.log)
// 每隔500毫秒发送一个数字,从0开始,发送到40
subs.unsubscrible(); // 暂停订阅

3.1 RxJS运作方式

  • 建立可观察的Observable物件
var click$ = rxjs.fromEvent(document, 'click')
  • 建立观察者物件
var observer = {
    
     next: (x) => console.log(x) };

observer可以是函数,也可以是物件,物件有三种属性:next,error,complete

  • 建立订阅物件(订阅Observable物件,并传入Observer观察者物件)
var subs$ = click$.subscribe(observer);
  • 取消订阅Subscription物件
subs$.unsubscribe();

observable不会主动触发观察,需要有人订阅subscribe,才会触发观察行为 ;
接水管,连续过滤:

var subs$ = click$.pipe(
	filter(d => d.clientX < 500),
	take(4)
).subscribe(observer);

3.2 RxJS主体物件(Subject)用法

  • 建立主体物件(之后要用主体物件进行广播)
var subject = new rxjs.Subject();
  • 建立可观察的Observable物件
var clicks$ = rxjs.fromEvent(document, 'click')
  • 设定最多取得两个事件资料就将Observable物件设为完成
clicks$ = clicks$.pipe(take(2));
  • 设定将clicks$全部交由subject主体物件进行广播
clicks$.subscribe(subject);
  • 最后由subject建立Observer观察者物件
var subs1$ = subject.subscribe((x) => console.log(x.clientX));
var subs2$ = subject.subscribe((x) => console.log(x.clientY));
  • 取消订阅
subs1$.unsubscrible();
subs2$.unsubscribe();

subject帮助实现一个Observable被多个observer订阅的效果,相当于中间商;
subject在多个页面怎么操作;

4 常见的Operator运算子

4.1 建立运算子

负责建立一个Observable物件

  • from
  • ajax
  • defer
  • generate
  • fromEvent
  • interval
  • of
  • range

4.2 组合建立运算子

将多个Observable物件组合成一个Observable物件

  • race
  • zip
  • merge
  • forkJoin
  • concat
  • combineLatest

4.3 转换运算子

将Observable传入的资料转换成另一种格式

  • concatMap
  • map
  • mapTo
  • buffer
  • switchMapTo

4.4 过滤运算子

负责将Observable传入的资料过滤掉

  • debounce
  • debounceTime
  • filter
  • skip
  • throttle
  • throttleTime

4.5 组合运算子

负责组合多个Observable

  • combineAll
  • concatAll
  • startWith

4.6 多播运算子

负责将Observable广播给多位观察者

  • publish
  • share

4.7 错误处理运算子

负责处理Observable观察过程中出现的例外错误

  • catchError
  • retry
  • retryWhen
import {
    
     retry } from 'rxjs/operators';

ngOnInit(): void {
    
    
    this.http.get('/assets/area.json')
        .pipe(retry(3)) 
        // 请求不到数据,会再次尝试3次,还是抓不到就放弃,可以搭配delay等,延迟一定时间再retry
        .subscribe(data => {
    
    
            getArea(data);
        })
}

4.8 工具函式运算子

负责提供Observable执行过程的工具函式

  • tap
  • delay
  • timeout

4.9 条件式与布尔运算子

负责计算特定条件并回传布尔值的运算子

  • defaultEmpty
  • find
  • every
  • isEmpty

4.10 数学与汇总运算子

负责将Observable传来的资料进行数学/汇总运算

  • count
  • max
  • min
  • reduce

猜你喜欢

转载自blog.csdn.net/weixin_45678402/article/details/129562472