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));

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

删除之后问题消失:


代码:

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


测试结果如下:

效果:至少在大于等于 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));

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

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

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


或者使用如下代码,还是每秒产生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));

测试结果:

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

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);


相关文章
|
7月前
rxjs 里 CombineLatest 操作符的一个使用场景
rxjs 里 CombineLatest 操作符的一个使用场景
27 0
|
9月前
|
缓存 JavaScript 前端开发
RxJS系列05:操作符 Operators(下)
RxJS系列05:操作符 Operators(下)
|
6月前
Rxjs tap 操作符的使用场景介绍
Rxjs tap 操作符的使用场景介绍
40 0
|
7月前
Rxjs TakeUntil 操作符的学习笔记
Rxjs TakeUntil 操作符的学习笔记
41 0
|
7月前
rxjs Observable 两大类操作符简介
rxjs Observable 两大类操作符简介
41 1
|
7月前
|
索引
rxjs 里 Skip 操作符的一个使用场景
rxjs 里 Skip 操作符的一个使用场景
83 0
|
9月前
|
JavaScript 前端开发 Go
RxJS系列04:操作符 Operators(上)
RxJS系列04:操作符 Operators(上)
|
缓存 前端开发 JavaScript
5 分钟温故知新 RxJS 【转换操作符】
RxJS 转换操作符,继续冲冲冲!熟悉的温故知新,不熟悉的混个脸熟先~
rxjs ThrottleTime 和 debounceTime 的操作符区别
rxjs ThrottleTime 和 debounceTime 的操作符区别
109 0
rxjs ThrottleTime 和 debounceTime 的操作符区别
RxJs SwitchMapTo 操作符之移花接木
RxJs SwitchMapTo 操作符之移花接木
121 0
RxJs SwitchMapTo 操作符之移花接木