Typescript 实现防抖和节流

在写这篇博客前,我们先来说说为啥需要防抖和节流?

马上过春节了,又到了每年一度的抢票环节了,数以万计的用户在网上订票,由于并发高后台压力大?网络差?导致用户在点击订票的时候,网站上马上就没有下文了,于是乎急切的用户们就疯狂的点击着查询?订购等按钮,无数重复请求被发送到后端,后端表示压力更大了。

在这种场景下,前端有多种方法限制用户无效请求,然而防抖和节流控制是比较优的选择,在没有提升用户操作复杂度的,用户不感知的前提下,有效提升了有效请求率。

防抖(个人理解):在指定时长内,若出现重复操作,以最后一次操作为准发送请求。

节流(个人理解):在指定时长内,若出现重复操作,以第一次为准。

下面我们来说说如何实现防抖和节流吧?最近项目中采用vue3.0+Typescript开发,下面讲讲如何用Typescript实现防抖节流。

/utils/common.ts

/**

 * 防抖 和 节流 类

 */

export class ActionControl {

  timeout = 0;

  fn: any = null;

  wait = 0;

  preActionTime = 0;

  constructor(fn: any, wait: number) {

    this.fn = fn;

    this.wait = wait;

  }

  debounce(): void {

    if (this.timeout !== 0) clearTimeout(this.timeout); //清除这个定时器

    this.timeout = setTimeout(this.fn, this.wait);

  }

  throttle(): void {

    if (this.preActionTime === 0) this.preActionTime = new Date().getTime();

    const timeBetween = new Date().getTime() - this.preActionTime;

    console.log(timeBetween);

    if (timeBetween >= this.wait) {

      this.timeout = setTimeout(() => {

        this.fn();

        this.preActionTime = 0;

      }, this.wait);

    }

  }

}

//使用方法,亲测有效

import { ActionControl } from "@/utils/common";

    let ac: any = null;

    //防抖批量操作

    const batchAction = () => {

      if (ac === null) {

        ac = new ActionControl(doBatchAction, 500);

      }

      ac.throttle();

    };

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 函数节流场景 例如:实现一个原生的拖拽功能(如果不用H5 Drag和Drop API),我们就需要一路监听mous...
    凡凡的小web阅读 4,196评论 0 0
  • 闭包 由于节流和防抖函数的实现都用到了闭包,所以在了解节流和防抖之前我先简单介绍下什么是闭包。 由于js代码在一个...
    喵咪_f9a1阅读 2,118评论 0 0
  • 防抖:把多次触发频繁的事件合并成一次去执行。就是最后一次事件触发后的指定时间内只执行一次回调函数,如果在指定的时间...
    Greens_dbd2阅读 1,648评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 12,214评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    余生动听阅读 13,596评论 0 11

友情链接更多精彩内容