RxJS 是一个使用可观察序列编写异步和基于事件的程序的库,提供了一种核心类型 Observable、卫星类型(Observer、Scheduler、Subjects)和受 Array#extras 启发的操作符(map、filter、reduce、every 等),以允许将异步事件作为集合处理。
核心概念:
Observable:表示未来值或事件的可调用集合的想法。
Observer:是一个回调集合,它知道如何监听 Observable 传递的值。
Subscription:表示一个 Observable 的执行,主要用于取消执行。
Operators:是纯粹的功能,从而使处理与操作,如集合功能的编程风格 map,filter,concat,reduce,等。
Subject:相当于一个 EventEmitter,是昌亮将一个值或事件多播给多个 Observer 的唯一方式。
调度程序:是集中式的调度员控制并发性,使我们能够在计算发生在例如坐标 setTimeout 或 requestAnimationFrame 或他人。
第一个例子:
通常你注册事件监听器。
document.addEventListener('click', () => console.log('Clicked!'));- 使用 RxJS,您可以创建一个 observable。
import { fromEvent } from 'rxjs';fromEvent(document, 'click').subscribe(() => console.log('Clicked!'));- RxJS 的强大之处在于它能够使用纯函数生成值。这意嫌空味着您的代码不太容易出错。
- 通常你会创建一个不纯的函数,你的其他代码片段可能会弄乱你的状态。
let count = 0;document.addEventListener('click', () => console.log(`Clicked ${++count} times`));该扫描操作工作就像减芹迅瞎少数组。它需要一个暴露给回调的值。回调的返回值将成为下次运行回调时公开的下一个值。
流:
RxJS 有一系列的操作符,可以帮助你控制事件如何通过你的 observables。
这就是使用纯 JavaScript 每秒最多允许一次点击的方式:
let count = 0;let rate = 1000;let lastClick = Date.now() - rate;document.addEventListener('click', () => { if (Date.now() - lastClick >= rate) { console.log(`Clicked ${++count} times`); lastClick = Date.now(); }});import { fromEvent } from 'rxjs';import { throttleTime, scan } from 'rxjs/operators';fromEvent(document, 'click') .pipe( throttleTime(1000), scan(count => count + 1, 0) ) .subscribe(count => console.log(`Clicked ${count} times`));let count = 0;const rate = 1000;let lastClick = Date.now() - rate;document.addEventListener('click', event => { if (Date.now() - lastClick >= rate) { count += event.clientX; console.log(count); lastClick = Date.now(); }});import { fromEvent } from 'rxjs';import { throttleTime, map, scan } from 'rxjs/operators';fromEvent(document, 'click') .pipe( throttleTime(1000), map(event => event.clientX), scan((count, clientX) => count + clientX, 0) ) .subscribe(count => console.log(count));