RxJS
RxJS
在
Observable ( 可观察对象): 表示一个概念,这个概念是一个可调用的未来值或事件的集合。Observer ( 观察者): 一个回调函数的集合,它知道如何去监听由Observable 提供的值。Subscription ( 订阅): 表示Observable 的执行,主要用于取消Observable 的执行。Operators ( 操作符): 采用函数式编程风格的纯函数(pure function) ,使用像map
、filter
、concat
、flatMap
等这样的操作符来处理集合。Subject ( 主体): 相当于EventEmitter ,并且是将值或事件多路推送给多个Observer 的唯一方式。Schedulers ( 调度器): 用来控制并发并且是中央集权的调度员,允许我们在发生计算时进行协调,例如setTimeout
或requestAnimationFrame
或其他。
利用这些对象,
- 同步和异步的统一写法
- 数据变更过程的组合拆分
- 数据和视图的精确绑定
- 条件变更后,对应数据自动重新计算
Hello World
注册事件监听器的常规写法。
const button = document.querySelector("button");
button.addEventListener("click", () => console.log("Clicked!"));
使用
const button = document.querySelector("button");
Rx.Observable.fromEvent(button, "click").subscribe(() =>
console.log("Clicked!")
);
纯净性(Purity)
使得
const count = 0;
const button = document.querySelector("button");
button.addEventListener("click", () => console.log(`Clicked ${++count} times`));
使用
const button = document.querySelector('button');
Rx.Observable.fromEvent(button, 'click')
.scan(count => count + 1, 0)
.subscribe(count => console.log(`Clicked ${count} times`));
流动性(Flow)
提供了一整套操作符来帮助你控制事件如何流经
下面的代码展示的是如何控制一秒钟内最多点击一次,先来看使用普通的
const count = 0;
const rate = 1000;
const lastClick = Date.now() - rate;
const button = document.querySelector("button");
button.addEventListener("click", () => {
if (Date.now() - lastClick >= rate) {
console.log(`Clicked ${++count} times`);
lastClick = Date.now();
}
});
使用
const button = document.querySelector("button");
Rx.Observable.fromEvent(button, "click")
.throttleTime(1000)
.scan((count) => count + 1, 0)
.subscribe((count) => console.log(`Clicked ${count} times`));
其他流程控制操作符有
值(Values)
对于流经
下面的代码展示的是如何累加每次点击的鼠标
const count = 0;
const rate = 1000;
const lastClick = Date.now() - rate;
const button = document.querySelector("button");
button.addEventListener("click", (event) => {
if (Date.now() - lastClick >= rate) {
count += event.clientX;
console.log(count);
lastClick = Date.now();
}
});
使用
const button = document.querySelector("button");
Rx.Observable.fromEvent(button, "click")
.throttleTime(1000)
.map((event) => event.clientX)
.scan((count, clientX) => count + clientX, 0)
.subscribe((count) => console.log(count));
其他产生值的操作符有