秒杀按钮引发的防抖节流思考

简介: 当点击秒杀按钮的时候,使用防抖,如果一直点击,接口是否能发出去??还是最后一次点击时会

前言

当点击秒杀按钮的时候,使用防抖,如果一直点击,接口是否能发出去??还是最后一次点击时会发出。

使用防抖函数来处理点击事件,可以确保在短时间内多次点击只有最后一次生效。如果一直点击按钮,在防抖函数设定的延迟时间内,只有最后一次点击会触发接口的请求,前面的点击事件将被忽略。

因此,只有最后一次点击的接口能够发出去,前面的点击事件不会触发接口请求。


防抖和节流的区别:

防抖(Debounce-规定时间结束后执行)

:当事件连续触发时,只有在固定的延迟时间(如300ms)内没有再次触发事件,才会执行事件处理函数。如果在延迟时间内再次触发事件,则重新开始计时。

节流(Throttle-规定时间内执行一次):

当事件连续触发时,在固定的时间间隔(如300ms)内,只会执行一次事件处理函数。即使在时间间隔内多次触发事件,也只会执行一次,而不会重复执行。

总结

  • 防抖:防止抖动,单位时间内事件触发会被重置,避免事件被误伤触发多次。代码实现重在清零 clearTimeout
  • 节流:控制流量,单位时间内事件只能触发一次。代码实现重在开锁关锁 timer=timeout; timer=null
export class Lodash {
    // 存储防抖节流的函数,用于检测清除
    private debounceTimeout: NodeJS.Timeout | null
    private throttleTimeout: NodeJS.Timeout | null
    private runTime:number
    // eslint-disable-next-line @typescript-eslint/no-useless-constructor
    constructor() {
        this.debounceTimeout = null
        this.throttleTimeout = null
        this.runTime = 0
    }
    // 防抖-可以被覆盖,简单点说,在单位时间内,永远执行最后一次防抖函数
    public debounce(fc: (...args: any[]) => void, delay: number = 1000) {
        if (this.debounceTimeout) clearTimeout(this.debounceTimeout)
        return (...args:any[]) => {
            this.debounceTimeout = setTimeout(() => {
                fc(...args)
            }, delay)
        }
    }
    // 节流函数-单位时间结束后内只执行一次,
    // 延迟节流 — 单位时间结束后执行,
    // 立即执行 -立刻执行节流函数, 需等时间结束,方可执行下一次
    public throttleAweit(fc:(...args:any[])=>void,delay:number = 1000){
        // 立即执行的节流函数
        // 1、当前时间 需要大于上次节流执行的事件,方可执行
        // 当前时间
        const nowTime = new Date().getTime() 
        return (...args:any[])=>{
            if(nowTime - this.runTime > delay){
                fc(...args)
                this.runTime = new Date().getTime()
            } 
        }
    }
    public throttleAsync(fc:(...args:any[])=>void,delay:number = 1000){
        // 延迟节流
        if(this.throttleTimeout){
            return ()=>{}
        }
        return (...args:any[])=>{
            this.throttleTimeout = setTimeout(()=>{
                fc(...args)
                this.throttleTimeout = null
            },delay)
        }
    }
}

相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
自然语言处理 算法 大数据
Python大数据:jieba分词,词频统计
实验目的 学习如何读取一个文件 学习如何使用DataFrame 学习jieba中文分词组件及停用词处理原理 了解Jupyter Notebook 概念 中文分词 在自然语言处理过程中,为了能更好地处理句子,往往需要把句子拆开分成一个一个的词语,这样能更好的分析句子的特性,这个过程叫就叫做分词。
10016 0
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
739 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
存储 缓存 数据安全/隐私保护
FGPA的简介及应用
FGPA的简介及应用
2368 2
|
Java 索引
Java开发指南 | 第三十篇】Java 枚举(enum)
Java开发指南 | 第三十篇】Java 枚举(enum)
505 1
|
缓存 网络协议 算法
(二)Java网络编程之爆肝HTTP、HTTPS、TLS协议及对称与非对称加密原理!
作为一名程序员,尤其是Java程序员,那必须得了解并掌握HTTP/HTTPS相关知识。因为在如今计算机网络通信中,HTTP协议的作用功不可没,无论是日常上网追剧、冲���、亦或是接口开发、调用等,必然存在HTTP的“影子”在内。尤其对于WEB开发者而言,HTTP几乎是每天会打交道的东西。
679 10
|
存储 JavaScript 前端开发
HarmonyOS应用开发者基础认证考试(95分答案)
HarmonyOS应用开发者基础认证考试(95分答案)
10766 17
|
存储 运维 网络协议
【开源物联网平台】物联网设备上云提供开箱即用接入SDK
IOTDeviceSDK是物联网平台提供的设备端软件开发工具包,可简化开发过程,实现设备快速接入各大物联网平台。设备厂商获取SDK后,根据需要选择相应功能进行移植,即可快速集成IOTDeviceSDK,实现设备的接入。
968 1
|
Java
log4j2定期删除日志文件的配置
确保将以上配置嵌入到你的Log4j 2配置文件中,并根据项目的需求进行适当的调整。
1100 1
|
关系型数据库 MySQL 数据库
|
Web App开发 移动开发 视频直播
实时视频直播客户端技术盘点:Native、HTML5、WebRTC、微信小程序
1、前言 2017 年 12 月,微信小程序向开发者开放了实时音视频能力,给业内带来广阔的想象空间。连麦互动视频直播技术在 2016 年直播风口中成为视频直播的标配,然而只有在原生的 APP 上才能保障良好的用户体验。
4027 0