节流和防抖的定义、使用场景及手写

简介: 节流和防抖的定义、使用场景及手写

节流

事件触发后,规定时间内,事件处理函数不能再次被调用。

也就是说在规定的时间内,函数只能被调用一次,且是最先被触发调用的那次。

举例:英雄联盟中的技能冷却时间,也就是技能CD,用一次后,过若干秒才能用下一次

使用场景: 滚动加载更多、搜索框搜的索联想功能、高频点击、表单重复提交……

const throttle = (fn, delay) => {
   let timer = null
   return (...args) => {
     if(timer) {return}  // 如果还在cd,就return
     fn.call(undefined, ...args) //放技能
     timer = setTimeout(()=>{
       timer = null // cd已过
     }, delay)
   }
 }
 const fn = throttle( () => {console.log("我是个放技能函数")}, 3000)

防抖

多次触发事件,事件处理函数只能执行一次,并且是在触发操作结束时执行。

也就是说,当一个事件被触发,准备执行事件函数前,会等待一定的时间(这时间是码农自己去定义的,比如 1 秒),如果没有再次被触发,那么就执行,如果被触发了,那就本次作废,重新从新触发的时间开始计算,并再次等待 1 秒,直到能最终执行!

举例:我们在玩英雄联盟时,回城需要8秒。如果你因为某种原因(被小兵打,自身移动了)脱离了回城状态,那么需要重新回城,重新计算这8秒。这个过程,我们便可以理解为是防抖。

应用场景:搜索框搜索输入,并在输入完以后自动搜索、手机号,邮箱验证输入检测、窗口大小 resize 变化后,再重新渲染。

const debounce = (handleTP, delay) => {
   let timer = null
   return (...args)=>{
     if(timer !== null) { // 第一次进入,timer没有被赋值,不会进入此判断。
       clearTimeout(timer) // 清空计时器,相当于打断回城
     }
     timer = setTimeout(()=>{ // 开始计时,相当于按下了回城键
       handleTP.call(undefined, ...args) // 调用回城方法
       timer = null
     }, delay)
   }
 }
 const fn = debounce( () => {console.log("我是个回城函数")}, 3000)

关于setTimeout与clearTimeout的小补充

setTimeout() 方法的返回值不是空,而是一个唯一的数值,这个数值有什么用呢?

如果你想要终止 setTimeout() 方法的执行,那就必须使用 clearTimeout() 方法来终止

而使用这个方法的时候,因为你可能同时调用了好几个 setTimeout() 方法,所以系统必须知道你到底要终止的是哪一个 setTimeout() 方法

这样 clearTimeout() 方法就需要一个参数,这个参数就是 setTimeout() 方法的返回值 (数值),用这个数值来唯一确定结束哪一个 setTimeout() 方法。



目录
相关文章
|
Shell Linux Ubuntu
解决在SecurecCRT登录后,发现方向键、backspace(退格键)、delete(删除键)为乱码的问题
问题:使用securecrt ssh到linux之后,backspace(退格键),delete(删除键),以及4个方向键都为乱码,不能正常使用。按tab键也没有自动补全文件名。 即: 按Backspace(退格键)和delete(删除键)屏幕显示的是:^H 按方向键则屏幕显示的是:^[[A^[[B^[[C^[[D 环境: SecureCRT8.
4354 0
|
容器
ThreeJs同一个场景多个相机的显示
这篇文章讲解了如何在Three.js中实现多相机功能,通过创建和布置多个相机及渲染器,从而能够在同一场景中从不同角度观察3D模型。
350 1
|
8月前
|
Web App开发 搜索推荐 安全
macOS Sonoma 14.7.5 (23H527) 正式版 ISO、IPSW、PKG 下载
macOS Sonoma 14.7.5 (23H527) 正式版 ISO、IPSW、PKG 下载
378 2
macOS Sonoma 14.7.5 (23H527) 正式版 ISO、IPSW、PKG 下载
|
12月前
|
机器学习/深度学习 人工智能 PyTorch
使用PyTorch实现GPT-2直接偏好优化训练:DPO方法改进及其与监督微调的效果对比
本文将系统阐述DPO的工作原理、实现机制,以及其与传统RLHF和SFT方法的本质区别。
927 22
使用PyTorch实现GPT-2直接偏好优化训练:DPO方法改进及其与监督微调的效果对比
|
机器学习/深度学习 并行计算 算法
Ebsynth:利用图像处理和计算机视觉的视频风格转换技术工具
EbSynth 是一款基于视频风格转换技术的工具,专注于将静态艺术风格应用到视频中的每一帧,使视频具有独特的艺术效果。它利用图像处理和计算机视觉技术,将用户提供的参考图像或绘画风格转换为视频效果。
532 2
|
存储
分区表和分桶表(高频重点)
分区表和分桶表(高频重点)
564 0
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
4313 1
|
监控 Java 中间件
8 个线程池最佳实践和坑!使用不当直接生产事故!
你好,我是 Guide。这篇文章我会简单总结一下我了解的使用线程池的时候应该注意的坑以及一些优秀的实践。拿来即用,美滋滋!
|
前端开发
vue3 script-setup 语法糖 父子组件通信 使用defineEmit,defineProps,defineExpose (useContext 弃用)
vue3 script-setup 语法糖 父子组件通信 使用defineEmit,defineProps,defineExpose (useContext 弃用)
311 0
|
人工智能 机器人 Python
Jupyter大升级:各种大模型都能连,聊天就能生成代码、错误修改
Jupyter大升级:各种大模型都能连,聊天就能生成代码、错误修改
988 0