RxJs 概览(包括工具介绍)

RxJs 概览(包括工具介绍)
最新回答
往事尾随而来

2022-12-21 10:35:00

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(); }});
  • 使用 RxJS:
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`));
  • 其它流量控制运算符滤波器,延迟,debounceTime,取,takeUntil,鲜明,distinctUntilChanged 等

  • 价值观

    您可以转换通过 observable 传递的值。

    以下是使用纯 JavaScript 为每次点击添加当前鼠标 x 位置的方法:

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(); }});
  • 使用 RxJS:
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));