首页 > 其他分享 >防抖和节流

防抖和节流

时间:2023-03-01 10:37:46浏览次数:16  
标签:function 防抖 节流 args timer delay let fn

  • 节流: n 秒内只运行一次,若在 n 秒内重复触发,只有一次生效
  • 防抖: n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时

防抖: 

function throttled1(fn, delay = 500) {
    let oldtime = Date.now()
    return function (...args) {
        let newtime = Date.now()
        if (newtime - oldtime >= delay) {
            fn.apply(null, args)
            oldtime = Date.now()
        }
    }
}
使用时间戳写法,事件会立即执行,停止触发后没有办法再次执行 
function throttled2(fn, delay = 500) {
    let timer = null
    return function (...args) {
        if (!timer) {
            timer = setTimeout(() => {
                fn.apply(this, args)
                timer = null
            }, delay);
        }
    }
}
使用定时器写法,delay毫秒后第一次执行,第二次事件停止触发后依然会再一次执行

个人还是习惯第二种写法

节流:

完成节流可以使用时间戳与定时器的写法

function throttled1(fn, delay = 500) {

    let oldtime = Date.now()

 

    return function (...args) {

        let newtime = Date.now()
        if (newtime - oldtime >= delay) {
            fn.apply(null, args)
            oldtime = Date.now();
        }
    }
}
使用时间戳写法,事件会立即执行,停止触发后没有办法再次执行
 
function throttled2(fn, delay = 500) {
    let timer = null
    return function (...args) {
        if (!timer) {
            timer = setTimeout(() => {
                fn.apply(this, args)
                timer = null
            }, delay);
        }
    }
}
使用定时器写法,delay毫秒后第一次执行,第二次事件停止触发后依然会再一次执行

function throttled(fn, delay) {
    let timer = null
    let starttime = Date.now()
    return function () {
        let curTime = Date.now() // 当前时间
        let remaining = delay - (curTime - starttime)  // 从上一次到现在,还剩下多少多余时间
        let context = this
        let args = arguments
        clearTimeout(timer)
        if (remaining <= 0) {
            fn.apply(context, args)
            starttime = Date.now()
        } else {
            timer = setTimeout(fn, remaining);
        }
    }
}
可以将时间戳写法的特性与定时器写法的特性相结合,实现一个更加精确的节流。 

标签:function,防抖,节流,args,timer,delay,let,fn
From: https://www.cnblogs.com/abpcore/p/17167115.html

相关文章

  • C++使用curl库 以字节流方式 发送 https同步请求
     //在数据头设置 Content-Typeapplication/octet-stream否则可能会默认因为有字符&造成无法正确传输;//设置消息头curl_slist*header=NULL;header=curl......
  • 防抖、节流
    //节流exportfunctionthrottle({delay=300,callback=()=>{}}){returnfunction(...args){const{isRunning}=throttleif(i......
  • 02_09_Java语音进阶||day09_IO概念、字节流、字符流、IO异常的处理、属性集
    第一章IO概念1.1什么是IOJava中I/O操作主要是指使用java.io包下的内容,进行输入,输出操作。输入也叫做:读取数据输出也叫做:写入数据内存(RAM),硬盘(ROM)1.2IO的分类1.3IO的......
  • Python Struct 处理网络字节流
    背景因为websocket请求/返回均需要处理字节流现返回基本能正常处理,但请求字段及加密方式与业务紧密相关,抓着开发大佬问了几遍,有点头疼 Python中的struct模块pac......
  • python | 使用PIL压缩图片并使用字节流输出
    python|使用PIL压缩图片并使用字节流输出因为自己服务器上的博客流量比较小,所以加了这个用来压缩图片,不改变图片大小,将图像质量降低。直接丢代码了:importosfromio......
  • 践行绿色低碳,浪潮存储如何做到开源节流
    绿色发展是21世纪人类发展的共同追求,也是新时代中国发展的重要理念之一。二十大报告中明确提出,要协同推进降碳、减污、扩绿、增长,推进生态优先、节约集约、绿色低碳发展,加快......
  • 字节流的基本流:FileInputStream
    FileInputStream的基本用法字节输出流的循环读取文件的拷贝文件拷贝的弊端和改进方案FileInputStream的基本用法packagecom;importjava.io.*;public......
  • React-Hooks怎样封装防抖和节流-面试真题
    Debouncedebounce原意消除抖动,对于事件触发频繁的场景,只有最后由程序控制的事件是有效的。防抖函数,我们需要做的是在一件事触发的时候设置一个定时器使事件延迟发生,在......
  • 防抖与节流:教你倾听时插话的技巧
    本文内容主要翻译自issue中国外大佬对防抖与节流的解释,后面补充了自己的理解和总结。什么是防抖与节流防抖和节流是处理“过于频繁”发生的事情的常用技术。想象一下,......
  • 00022.09 用字节流读写文件:FileInputStream和FileOutputStream
    用文件字节流读写文件目录文章目录​​用文件字节流读写文件目录​​​​前言​​​​一、InputStream​​​​二、使用字节流,来读取纯文本文件步骤​​​​三、复制任意......