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

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 当点击秒杀按钮的时候,使用防抖,如果一直点击,接口是否能发出去??还是最后一次点击时会

前言

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

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

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


防抖和节流的区别:

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

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
6月前
节流、防抖
节流、防抖
42 2
|
6月前
|
前端开发 UED
关于防抖和节流的理解
防抖和节流是前端开发中常用的两种性能优化技术。
36 0
|
11月前
|
前端开发
按钮防抖
按钮防抖
87 0
防抖&节流
防抖&节流
116 0
什么是防抖和节流,怎么实现一个防抖和节流?
功能:当事件被触发N秒之后再执行回调,如果在N秒内被触发,则重新计时。
|
UED
防抖和节流怎么做
防抖和节流都是为了控制代码执行频率,提高性能和用户体验。
37 0
面试官:防抖和节流的区别是啥?实现一个防抖和节流函数(一)
面试官:防抖和节流的区别是啥?实现一个防抖和节流函数(一)
|
JavaScript 前端开发
节流与防抖
节流与防抖
50 0