rxjs tutorial
RxJS 基本介紹
- 官方对ReactiveX的定义
ReactiveX is a library for composing asynchronous and event-based programs by using observable sequences.
It extends the observer pattern to support sequences of data and/or events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synchronization, thread-safety, concurrent data structures, and non-blocking I/O.
简单来说,Rxjs就是一个处理异步行为更加优雅的库,它主要提供了一堆操作符(Operators)处理Observable对象,包括创建(creation),转换(transformation),组合(combination)和过滤(filtering)
prerequisites
- 了解基本的函数编程概念
- 了解基本的观察者模式(发布/订阅模式),迭代器模式
- 掌握ES6+的相关知识点,包括数组(map,of,from,reduce,reduceRight...),对象的操作
常用的创建操作符
- 使用
import { /** 操作符 **/} from 'rxjs - 常用创建Observable静态实例的方法(前4个使用频率较高)
- Observable.create(callback)
- of 单个或多个对象转换成observable
- from 将可迭代对象(Set...),array,arrayLike,promise等中每个值转换成observable,和of类似,函数参数不同
- fromEvent 将事件转换成 observable,第一个参数是dom对象,第二个参数是事件名
- fromEventPattern 处理自定义事件,类似addEventListener
- interval 类似setTimeout,第一个参数必须是数值
- timer 类似interval,可以指定第二个参数
- range 顺序获取范围内的数值,差值为1
- throwError 创建一个observable,抛出错误时会执行
- EMPTY 创建空的observable,即订阅时立即完成(empty官方已经不推荐使用)
- Never 创建一个的observable,订阅时什么也不做(never官方已经不推荐使用)
- merge 连接多个observable,订阅时同时处理给定的输入
- concat 连接多个observable,订阅时按顺序处理给定的输入
- race 只处理多个输入observable中,最快执行的那个,有点类似promise.race
- combineLatest 连接多个observable,直到每个observable有值,才会输出最终值,而且其回调的执行依赖每个observable的最新元素
- zip 将多个observable合并成一个observable,输出是每个observable相同索引的值,而且其回调的执行依赖每个observable的相同索引的元素
- Code Example
常用的转换操作符(transformation)
- 使用
import { /** 操作符 **/} from 'rxjs/operators
- map 类似es6 map方法,对observable的每一个值进行处理
- mapTo observable每次订阅(执行)时,每次输出给定(固定)的值
- switchMap 只处理最新的Observable
- mergeMap map+mergeAll
- concatMapmap+concatAll
- scan
- reduce 类型es6 reduce
常用的组合操作符(combination)
- mergeAll 和merge类似,将多个observable一起执行
mergeAll(2) - concatAll 和concat类似,合并多个observable成一个,然后按顺序一个一个执行
concatAll() - combineAll 和combineLatest类似
- startWith 传递开始输出的元素
startWith("first", "second")
常用的过滤操作符(filtering)
- filter 类似es6 filter方法,对observable的每一个值进行处理,并返回一个新的observable
- find 类似es6 find方法找到observable中第一个符合条件的值
find(v=>v%2===0) - first 取第一个值或者找到observable中第一个符合条件的值
first(v=>v%2===0) - last 取最后一个个值或者找到observable中最后一个符合条件的值
last(v=>v%2===0) - single 取第一个符合条件的数字
single(v=>v===1) - take 取前几个元素
take(3) - takeLast 取最后几个元素
takeLast(3) - takeUtil 直到传入的observable完成时触发
takeUtil(click) - skip 忽略前几个元素
skip(3) - throttle 节流
- debounce 防抖
常用工具操作符
- tap 对Observable中的每个值进行操作,无返回值
- delay 延迟开始输出的时间
delay(1000) - repeat 充分执行
repeat(2) - finalize 类似finally
错误处理
- catchError 处理observable stream中错误
- retry 重试
retry(1) - retryWhen 重试,需要回调参数
说明
- 本教成是基于Rxjs v6+