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

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

前言

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

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

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


防抖和节流的区别:

防抖(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)
        }
    }
}

相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
自然语言处理 算法 大数据
Python大数据:jieba分词,词频统计
实验目的 学习如何读取一个文件 学习如何使用DataFrame 学习jieba中文分词组件及停用词处理原理 了解Jupyter Notebook 概念 中文分词 在自然语言处理过程中,为了能更好地处理句子,往往需要把句子拆开分成一个一个的词语,这样能更好的分析句子的特性,这个过程叫就叫做分词。
9767 0
|
存储 缓存 Java
面试官:你知道包装类的缓存机制吗?
面试官:你知道包装类的缓存机制吗?
1776 0
|
11月前
|
前端开发 JavaScript 开发工具
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
720 5
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
JavaScript NoSQL 前端开发
|
缓存 网络协议 算法
(二)Java网络编程之爆肝HTTP、HTTPS、TLS协议及对称与非对称加密原理!
作为一名程序员,尤其是Java程序员,那必须得了解并掌握HTTP/HTTPS相关知识。因为在如今计算机网络通信中,HTTP协议的作用功不可没,无论是日常上网追剧、冲���、亦或是接口开发、调用等,必然存在HTTP的“影子”在内。尤其对于WEB开发者而言,HTTP几乎是每天会打交道的东西。
418 10
|
前端开发
CSS:为什么看起来content-box更合理,但还是经常使用border-box?
CSS:为什么看起来content-box更合理,但还是经常使用border-box?
424 2
|
存储 JavaScript 前端开发
HarmonyOS应用开发者基础认证考试(95分答案)
HarmonyOS应用开发者基础认证考试(95分答案)
10308 17
|
Java
log4j2定期删除日志文件的配置
确保将以上配置嵌入到你的Log4j 2配置文件中,并根据项目的需求进行适当的调整。
863 1
|
存储 运维 网络协议
【开源物联网平台】物联网设备上云提供开箱即用接入SDK
IOTDeviceSDK是物联网平台提供的设备端软件开发工具包,可简化开发过程,实现设备快速接入各大物联网平台。设备厂商获取SDK后,根据需要选择相应功能进行移植,即可快速集成IOTDeviceSDK,实现设备的接入。
720 0
|
编解码 缓存 调度
Flutter笔记:Flutter的应用生命周期状态(lifecycleState)管理
Flutter笔记:Flutter的应用生命周期状态(lifecycleState)管理
754 0