rxjs ThrottleTime 和 debounceTime 的操作符区别

简介: rxjs ThrottleTime 和 debounceTime 的操作符区别
  • throttleTime 的作⽤是限制在 duration 时间范围内,从上游传递给下游数据的个数;
  • debounceTime 的作⽤是让传递给下游的数据间隔不能⼩于给定的时间 dueTime。

一旦把下列代码拷贝到 StackBlitz 里,就报错:

import { interval, throttleTime } from 'rxjs';
import 'rxjs/add/observable/interval';
import 'rxjs/add/operator/throttleTime';
const source$ = interval(1000);
const result$ = source$.pipe(throttleTime(2000));
result$.subscribe((data) => console.log(data));

35.png罪魁祸首就是这两行代码:

image.png

删除之后问题消失:

37.png

image.png

代码:

import { interval, throttleTime } from 'rxjs';
const source$ = interval(1000);
const result$ = source$.pipe(throttleTime(2000));
result$.subscribe((data) => console.log(data));

测试结果如下:

38.png

效果:至少在大于等于 2 的时间间隔内,只有1个数据发送到下游 Observable.

如果把上述代码改成 debounceTime:则没有任何输出:

import { debounceTime, interval, throttleTime } from 'rxjs';
const source$ = interval(1000);
const result$ = source$.pipe(debounceTime(2000));
result$.subscribe((data) => console.log(data));

39.png

因为 debounceTime 要等上游在 2 毫秒范围内不产⽣任何其他数据时才把这个数据传递给下游,但我们这个例子的实际情况是,每一秒钟上游都会产⽣新的数据,那么debounceTime 就又要重新开始计时。


除非把 interval 的时间间隔改成 大于 debounceTime 的参数,才能看到输出。


这里还能观察到一个重新生成整数序列的行为:

40.png

或者使用如下代码,还是每秒产生1个整数,但是加了一个 filter 操作:

import { debounceTime, filter, interval, throttleTime } from 'rxjs';
// filter((x) => x % 3 === 0)
const source$ = interval(1000);
const result$ = source$.pipe(
  filter((x) => x % 3 === 0),
  debounceTime(2000)
);
result$.subscribe((data) => console.log(data));

测试结果:

41.png

下列代码的功能:一秒钟之内,只允许用户点击一次按钮:

const click$ = Rx.Observerable.fromEvent(addToCartButton, "click");
click$.throttleTime(1000).subscribe(addToCardHandler);

用户滚动网页停止超过 200 毫秒后,才触发 scrollHandler:

const scroll$ = Rx.Observerable.fromEvent(window, "scroll");
scroll$.debounceTime(200).subscribe(scrollHandler);



40.png

目录
相关文章
|
8月前
rxjs 里 CombineLatest 操作符的一个使用场景
rxjs 里 CombineLatest 操作符的一个使用场景
29 0
|
10月前
|
缓存 JavaScript 前端开发
RxJS系列05:操作符 Operators(下)
RxJS系列05:操作符 Operators(下)
|
8月前
rxjs ThrottleTime 和 debounceTime 的操作符区别
rxjs ThrottleTime 和 debounceTime 的操作符区别
61 0
|
7月前
Rxjs tap 操作符的使用场景介绍
Rxjs tap 操作符的使用场景介绍
42 0
|
8月前
Rxjs TakeUntil 操作符的学习笔记
Rxjs TakeUntil 操作符的学习笔记
42 0
|
8月前
rxjs Observable 两大类操作符简介
rxjs Observable 两大类操作符简介
42 1
|
8月前
|
索引
rxjs 里 Skip 操作符的一个使用场景
rxjs 里 Skip 操作符的一个使用场景
86 0
|
10月前
|
JavaScript 前端开发 Go
RxJS系列04:操作符 Operators(上)
RxJS系列04:操作符 Operators(上)
|
缓存 前端开发 JavaScript
5 分钟温故知新 RxJS 【转换操作符】
RxJS 转换操作符,继续冲冲冲!熟悉的温故知新,不熟悉的混个脸熟先~
|
前端开发 JavaScript
3 分钟温故知新 RxJS 【创建实例操作符】
RxJS 有很多神奇的东西,包括链式调用、惰性输出值、隔离数据和操作、响应式编程等等; 它是函数式编程中 monad 的一种实际应用;它是 promise 的进化形态;它是理解 JS 异步、处理异步的宝剑...... 所以,借着更文的契机,日日新、月月新,学习 RxJS 接着冲~