当前位置:   article > 正文

Angular 基础篇——Rxjs之四:debounce, first, last, throttle, delay_rxjs debounce

rxjs debounce

RxJS简介

Reactive Extensions for JavaScript

RxJS 是一个库,它通过使用 observable 序列来编写异步和基于事件的程序。它提供了一个核心类型 Observable,附属类型 (Observer、 Schedulers、 Subjects) 和受 [Array#extras] 启发的操作符 (map、filter、reduce、every, 等等),这些数组操作符可以把异步事件作为集合来处理。

RxJS核心概念

Observable (可观察对象):表示一个概念,这个概念是一个可调用的未来值或事件的集合。

Observer (观察者):一个回调函数的集合,它知道如何去监听由 Observable 提供的值。

Subscription (订阅):表示 Observable 的执行,主要用于取消 Observable 的执行。

Operators (操作符): 采用函数式编程风格的纯函数 (pure function),使用像 map、filter、concat、flatMap 等这样的操作符来处理集合。

Subject (主体): 相当于 EventEmitter,并且是将值或事件多路推送给多个 Observer 的唯一方式。

Schedulers(调度器):用来控制并发并且是中央集权的调度员,允许我们在发生计算时进行协调,例如 setTimeout 或 requestAnimationFrame 或其他。

Debounce

仅在特定时间段后才从源中观察到值 由另一个 Observable 确定的已通过,而没有其他源发射。简单的来说就是接收一个返回Observable的方法,,由第二个Observable来确定是否发射

原理图

示例

  1. import { fromEvent, interval } from 'rxjs';
  2. import { debounce } from 'rxjs/operators';
  3. const clicks = fromEvent(document, 'click');
  4. const result = clicks.pipe(debounce(() => interval(1000)));
  5. result.subscribe(x => console.log(x));

当点击的时候要延迟一秒后才发射,在这一秒内,再次点击,则之前一次不算,重新延迟一秒发射最后一次点击. 以后每一次点击开始延迟一秒在发射,如果多次点击,间隔小于1秒,则取最后一次

First

仅发出源 Observable 发出的第一个值(或满足某些条件的第一个值)。

原理图

示例1 发出第一个值

  1. import { from } from 'rxjs';
  2. import { first } from 'rxjs/operators';
  3. const source = from([1, 2, 3, 4, 5]);
  4. const example = source.pipe(first());
  5. const subscribe = example.subscribe(val => console.log(`First value: ${val}`));
  6. // 输出: "First value: 1"

示例2 发出第一个满足条件的值

  1. import { from } from 'rxjs';
  2. import { first } from 'rxjs/operators';
  3. const source = from([1, 2, 3, 4, 5]);
  4. const example = source.pipe(first(num => num === 5));
  5. const subscribe = example.subscribe(val =>
  6. console.log(`First to pass test: ${val}`)
  7. );
  8. // 输出: "First to pass test: 5"

示例3 满足不了条件,发送默认值

  1. import { from } from 'rxjs';
  2. import { first } from 'rxjs/operators';
  3. const source = from([1, 2, 3, 4, 5]);
  4. const example = source.pipe(first(val => val > 5, 'Nothing'));
  5. const subscribe = example.subscribe(val => console.log(val));
  6. // 输出: 'Nothing'

Last

根据提供的表达式,在源 observable 完成时发出它的最后一个值。跟first刚好相反,发送最后一个

原理图

示例 发送最后一个值

  1. import { from } from 'rxjs';
  2. import { last } from 'rxjs/operators';
  3. const source = from([1, 2, 3, 4, 5]);
  4. const example = source.pipe(last());
  5. const subscribe = example.subscribe(val => console.log(`Last value: ${val}`));
  6. // 输出: "Last value: 5"

Throttle

从源 Observable 发出一个值,然后在另一个 Observable 确定的持续时间内忽略后续源值,然后重复此过程

我的理解是接收一个返回Observable的方法, 由第二个Observable来确定第一个Observable的下一次值是否发射

原理图

示例

  1. import { interval } from 'rxjs';
  2. import { throttle } from 'rxjs/operators';
  3. const interval$ = interval(500);
  4. const result = interval$.pipe(throttle(ev => interval(2000)));
  5. result.subscribe(x => console.log(x));

比如第一个Observable的状态为true的时候,他的数据能发射成功,但是他发射成功之后状态就会变成false,此时数据无法发送出去,只有第二个Observable触发了,第一个Observable的状态才会为true,数据才能发送成功,之后状态又为false,需要第二个Observable触发转状态,如此反复。

所以结果是每过两秒打印一次,0,5,10,15,20

Delay

根据给定时间延迟发出值

原理图

示例1 将每次点击延迟一秒钟

  1. import { fromEvent } from 'rxjs';
  2. import { delay } from 'rxjs/operators';
  3. const clicks = fromEvent(document, 'click');
  4. const delayedClicks = clicks.pipe(delay(1000));
  5. delayedClicks.subscribe(x => console.log(x));
  6. // 所有的点击都会延迟一秒才发出

示例2 把点击延迟到指定的时间后才发出

  1. import { fromEvent } from 'rxjs';
  2. import { delay } from 'rxjs/operators';
  3. const clicks = fromEvent(document, 'click');
  4. const date = new Date('March 15, 2050 12:00:00');
  5. const delayedClicks = clicks.pipe(delay(date));
  6. delayedClicks.subscribe(x => console.log(x));

通过上述4篇文章,基本涵盖了Rxjs日常能用到的所有的方法。其他的使用概率偏低,但是思想都是一样的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/222985
推荐阅读
相关标签
  

闽ICP备14008679号