哥伦布

防抖和节流原理以及实现方法

何谓节流和防抖?

节流

节流的意思是,规定时间内,只触发一次。比如我们设定500ms,在这个时间内,无论点击按钮多少次,它都只会触发一次。具体场景可以是抢购时候,由于有无数人 快速点击按钮,如果每次点击都发送请求,就会给服务器造成巨大的压力,但是我们进行节流后,就会大大减少请求的次数。

防抖

防抖的意思是,在连续的操作中,无论进行了多长时间,只有某一次的操作后在指定的时间内没有再操作,这一次才被判定有效。具体场景可以搜索框输入关键字过程中实时 请求服务器匹配搜索结果,如果不进行处理,那么就是输入框内容一直变化,导致一直发送请求。如果进行防抖处理,结果就是当我们输入内容完成后,一定时间(比如500ms)没有再 输入内容,这时再触发请求。

结合以上两种情况,回到我们最实际的场景,比如防止表单提交按钮被多次触发,我们应该选择使用节流而不是防抖方案。

防抖debounceTail

复制代码
只执行首次

// 防抖 且首次执行
// 采用原理:第一操作触发,连续操作时,最后一次操作打开任务开关(并非执行任务),任务将在下一次操作时触发)
function debounceStart(fn, delay, ctx) {
    let immediate = true 
    let movement = null
    return function() {
        let args = arguments
        
        // 开关打开时,执行任务
        if (immediate) {
            fn.apply(ctx, args)
            immediate = false
        }
        // 清空上一次操作
        clearTimeout(movement)
        
        // 任务开关打开
        movement = setTimeout(function() {
            immediate = true
        }, delay)
    }
}

只执行最后一次

// 防抖 尾部执行
// 采用原理:连续操作时,上次设置的setTimeout被clear掉
function debounceTail(fn, delay, ctx) {
    let movement = null
    return function() {
        let args = arguments
        
        // 清空上一次操作
        clearTimeout(movement)
        
        // delay时间之后,任务执行
        movement = setTimeout(function() {
            fn.apply(ctx, args)
        }, delay)
    }
}
复制代码

节流函数throttle

复制代码
// 节流方案1,每delay的时间执行一次,通过开关控制
function throttle(fn, delay, ctx) {
    let isAvail = true
    return function () {
        let args = arguments // 开关打开时,执行任务 
        if (isAvail) {
            fn.apply(ctx, args)
            isAvail = false // delay时间之后,任务开关打开 
            setTimeout(function () { isAvail = true }, delay)
        }
    }
}
// 节流方案2,通过计算开始和结束时间
function throttle(fn,delay){
            // 记录上一次函数出发的时间
            var lastTime = 0
            return function(){
            // 记录当前函数触发的时间
            var nowTime = new Date().getTime()
            // 当当前时间减去上一次执行时间大于这个指定间隔时间才让他触发这个函数
            if(nowTime - lastTime > delay){
                // 绑定this指向
                fn.call(this)
                //同步时间
                lastTime = nowTime
            }
            }
       }
复制代码

详见 “uview开发文档防抖与节流” 部分右边用例狂点几下就明白了

posted @   南柯Dream丶  阅读(2744)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示