函数的节流与防抖在答题小程序项目中的应用

news/2024/11/7 12:45:01/

无论是公司项目,还是个人项目,往往会遇到这样的一些造成回调开销加大的问题,比如重复提交、快速点击、高频事件等。

问题

PC端以资产配置项目为例,存在的问题:

1)用户在搜索客户信息输入实时触发搜索,导致多次提交。

2)用户搜索查询时,第一次查询请求时间比较长,然后第二次请求可能比第一次返回先,导致查询结果和筛选不对应的情况。

3)调整浏览器窗口大小的时候,触发resize 事件,这时echart重绘的频率控制。

小程序端以答题考试知识库项目为例,存在的问题:

1)重复提交

单位时间内,多次请求,造成的后台重复录入现象。

2)快速点击

单位时间内,快速点击查询或者答题,触发异步事件,造成数据与ui混乱的现象。

3)高频事件

单位时间内,触发的各类事件,且响应速度低于请求,造成的卡顿或其他混乱现象。

知识库:

人物评选投票:

解决方案

一般在项目中比较常见用的方式是事件或函数的节流(throttle)与防抖(debounce)。

通常,scroll 事件,resize 事件、鼠标事件(比如 mousemove、mouseover 等)、键盘事件(keyup、keydown 等)都存在被频繁触发的风险。频繁触发回调导致的大量计算会引发页面的抖动甚至卡顿。

为了规避这种情况,我们需要一些手段来控制事件被触发的频率。然而,节流(throttle)与防抖(debounce)是我们在日常开发中常用的优质代码片段,能够给我们的项目带来性能的提升。

节流(throttle)与防抖(debounce)的本质

这两个东西都以闭包的形式存在。

它们通过对事件对应的回调函数进行包裹、以自由变量的形式缓存时间信息,最后 setTimeout 来控制事件的触发频率

节流(throttle)

节流:每间隔某个时间去执行某函数。

节流(throttle) 的中心思想在于:在某段时间内,不管你触发了多少次回调,我都只认第一次,并在计时结束时给予响应。

function throttle(fn: Function, delay: number) {let timer: any = null;return function () {if (timer) return;//如果定时器还在,说明上一次延迟执行还没有完成,则不再执行timer = setTimeout(() => {fn.apply(this, arguments);timer = null;}, delay);};
}

防抖(debounce)

防抖:将几次操作合并为一次操作进行。

防抖(debounce)的中心思想在于:我会等你到底。在某段时间内,不管你触发了多少次回调,我都只认最后一次

function debounce(fn: Function, delay: number) {let timer: any = null;return function () {if (timer) {clearTimeout(timer);//如果方法多次触发,则把上次记录的延迟执行代码清掉,重新开始}timer = setTimeout(() => {fn.apply(this, arguments);timer = null;}, delay);};
}

总结

防止事件频繁触发回调函数的方法有很多,其中防抖和节流是现在比较主流的处理方式。

节流和防抖动最大的区别就是,节流函数不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而防抖动只是在最后一次事件后才触发一次函数。

 


http://www.ppmy.cn/news/824011.html

相关文章

Linux--获取与杀死当前进程PID

获取当前进程的代码&#xff1a; #include <sys/types.h>pid_t idgetpid();//获取的是自己的进程PID 杀死当前进程的指令&#xff1a; kill -9 进程的PID 我要是kill -9 16865(-bash进程)&#xff0c;你会发现无论你输入clear、ls、还是vim...指令&#xff0c;都无…

使用vite创建vue3的Cesium基础项目

使用vite创建vue3的Cesium基础项目 使用vite创建vue3项目&#xff1a;可以参考官方文档Vite官方中文文档 1.1 在指定文件夹路径下使用npm&#xff08;前提是已经安装好了node&#xff09;&#xff1a; npm create vitelatest1.2 cd到创建的项目文件夹&#xff1a; cd 项目文件夹…

初起炉灶。。。

不知是追逐流行还是真的需要&#xff0c;今天算是正式为自己建立起个Blog&#xff0c;可谓初起炉灶。 转载于:https://www.cnblogs.com/yb_cn/archive/2005/01/13/91298.html

测试开发工作者日记:2020.11.2

最近建立了讨论群&#xff0c;虽然被大家改成了催更群。但是依然是很欢乐的技术讨论&#xff0c;热火朝天的&#xff0c;老迪拜表示很欣慰&#xff5e; 但是群里有个很让人不好意思的现象&#xff0c;就是吹群主的太多了。其实群主也就是作者技术水平远远没达到专业的地步&…

明厨亮灶之AI平台算法开发

传统明厨亮灶&#xff0c;是指餐饮服务提供者采用透明玻璃、视频等方式&#xff0c;向社会公众展示餐饮服务相关过程的一种形式。使餐饮企业顾客可以直观地看到后厨员工的操作是否规范&#xff0c;卫生是否合格&#xff0c;是否有一些不应该出现的物品。明厨亮灶是对餐饮企业员…

系统测试——postman的400错误

如果Headers中不勾选Host&#xff0c;调用接口就会报400 Bad Request错误。

Yocto令Linux羽化成蝶

作为开放源码运动的旗舰&#xff0c;Linux曾经是新兴软件企业变革传统软件产业结构的希望。可是&#xff0c;这些年走下来&#xff0c;Linux表现出来的辉煌光环似乎主要是成就了别人&#xff0c;例如风行全球的Android的基础就是Linux。反观Linux自身&#xff0c;却仍然在潜行。…

编程便笺:Html5等待还是炉灶另起

html5是一场分合的大戏&#xff0c;看得人眼花缭乱&#xff1b;html5也是热词&#xff0c;时不时可以爆炒一顿&#xff0c;紧抓开发着的眼球&#xff1b;与html5相关的往往是五年计划、十年计划&#xff0c;在今天这样的环境下&#xff0c;可以説难能可贵&#xff0c;只是在赌开…