百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

拉动一下控制台大小,后台请求数量爆炸,竟是没做好防抖与节流

bigegpt 2024-08-24 23:07 2 浏览

点击上方?Java编程技术乐园,轻松关注!及时获取有趣有料的技术文章

文章很好,耐心阅读,记得点赞和关注哦~



前言

最近有个朋友在面试过程中遇到一个问题:什么是防抖和节流?糟了,这可触碰到我的知识盲区了,好像听也没听过这 2 个东西,痛定思痛,赶紧学习学习。

防抖(debounce)

在事件被触发 n 秒之后执行,如果在此期间再次触发事件,则重新开始计时。

乍一看,这不是闲的蛋疼吗?为啥要等 n 秒之后再执行呢?

本着存在即合理的原则,咱看不懂但咱得去学啊!经过十秒钟的思考,突然想起来之前做过的公司的一个小程序,使用的 mpvue+vant-weapp,van-field 标签并没有和数据进行双向绑定,而是每次都要触发 @input 事件,从而完成数据绑定:

这就导致了一个问题:

输一个手机号要触发 11 次事件!!如果是联想搜索的话。。。那画面太美!

我们先自己想一下办法来解决这个问题。

  • 首先我们需要在手机号输入完成之后将数据绑定到 phoneNumber 上然后进行联想搜索,怎么算输入完成呢,输入一个数字到找到下一个数字输入大概需要 1 不到秒,只要用户一秒内没有再次输入,则将输入框内容与 phoneNumber 绑定并进行联想搜索(什么?你说你输入五个字符就停下?不怕后台砍死你)。
  • 准备工具:一个需要触发的函数 debounce、一个定时器、一个输入框、一个判断是否输入完成的函数 getPhone。
  • 基本思路:输入绑定事件 getPhone,输入之后开启1秒定时器,如果在 1 秒内再次进行了输入,则清除之前的定时器,并且重新设置定时器;如果 1 秒内没有输入,则输入结束触发事件 a,进行联想搜索。
<input?id="phone"?type="text"/>


//?需要触发的函数
function?debounce(d){
????console.log("联想搜索phoneNumber:"?+?d)
}
let?inp?=?document.querySelector("#phone");
//?输入触发的事件
function?getPhone(fn,delay){
????let?timer;
????//?使用闭包,保证每次使用的定时器是同一个
????return?(d)=>{
????????clearTimeout(timer);
????????timer?=?setTimeout(()=>{
????????????fn(d);
????????????//?结束之后清除定时器
????????????clearTimeout(timer);
????????},delay)
????}
}

let?getPhoneDebounce?=?getPhone(debounce,1000);

inp.addEventListener('keyup',(e)=>{
????getPhoneDebounce(e.target.value);
})

这时候看输出:

是的只输出了一次号码,也就是说不用每次输入都进行一次搜索了。

节流(throttle)

如果持续触发一个事件,则在一定的时间内只执行一次事件。

那么问题来了,既然是持续触发了,那为啥还要设定一定时间内只执行一次呢?废话,你吃鸡为啥不用 AKM 非要去追梦抢狗杂呢?还不是因为 AKM 射速慢(狗杂真香)!



我们来试着做一个 AKM 的设计模拟:

  • 首先第一次点击射击的时候,打出一发子弹,当以极短的时间再次点击射击的时候,由于需要‘冷却’——也就是节流,再次点击无效,当冷却时间过了之后,再次点击射击,则继续下一次射击。
  • 准备工具:一个射击的函数 shot,一个判断射击间隔是否结束的函数 nextShot,一个触发射击的按钮,判断射击是否结束的定时器 timer。
  • 基本思路:第一次点击按钮的时候,触发 shot,当继续点击的时候,射击无效,只有过了定时器设置的时间才可以继续射击。
<button?id="shot">射击</button>


function?shot(){
????console.log('射击')
}
let?btn?=?document.querySelector('#shot');
function?nextShot(fn,delay){
????let?timer;
????//?闭包原理同上
????return?()=>{
????????//?定时器存在,无法射击
????????if(timer){
????????????console.log('禁止射击');
????????}else{??//?定时器不存在,射击,并设置定时器
????????????fn();
????????????timer?=?setTimeout(()=>{
????????????????//?定时器结束,可以射击
????????????????clearTimeout(timer);
????????????????timer?=?null;
????????????},delay)
????????}
????}
}
let?start?=?nextShot(shot,20);
btn.addEventListener('click',()=>{
????start();
})

当我们疯狂点击按钮的时候:

可能这个例子不是很突出,我再说个类似的,英雄联盟和DNF的技能冷却应该更适合~

是时候回归一下标题了,免得有人说我可以去 UC 震惊部了!公司的大数据组件目前是只要页面大小发生变化就会重新加载,这就导致了有时候拉一下控制台会发生很多次请求,这个时候就可以用防抖来解决一下了~


作者:.Ping
链接:https://juejin.im/post/5e0d7ab9f265da5d691035b5
来源:掘金


相关推荐

Docker篇(二):Docker实战,命令解析

大家好,我是杰哥上周我们通过几个问题,让大家对于Docker有了一个全局的认识。然而,说跟练往往是两个概念。从学习的角度来说,理论知识的学习,往往只是第一步,只有经过实战,才能真正掌握一门技术所以,本...

docker学习笔记——安装和基本操作

今天学习了docker的基本知识,记录一下docker的安装步骤和基本命令(以CentOS7.x为例)一、安装docker的步骤:1.yuminstall-yyum-utils2.yum-con...

不可错过的Docker完整笔记(dockerhib)

简介一、Docker简介Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,...

扔掉运营商的 IPTV 机顶盒,全屋全设备畅看 IPTV!

其实现在看电视节目的需求确实大大降低了,折腾也只是为了单纯的让它实现,享受这个过程带来的快乐而已,哈哈!预期构想家里所有设备直接接入网络随时接收并播放IPTV直播(电信点播的节目不是太多,但好在非常稳...

第五节 Docker 入门实践:从 Hello World 到容器操作

一、Docker容器基础运行(一)单次命令执行通过dockerrun命令可以直接在容器中执行指定命令,这是体验Docker最快捷的方式:#在ubuntu:15.10容器中执行ech...

替代Docker build的Buildah简单介绍

Buildah是用于通过较低级别的coreutils接口构建OCI兼容镜像的工具。与Podman相似,Buildah不依赖于Docker或CRI-O之类的守护程序,并且不需要root特权。Builda...

Docker 命令大全(docker命令大全记录表)

容器生命周期管理run-创建并启动一个新的容器。start/stop/restart-这些命令主要用于启动、停止和重启容器。kill-立即终止一个或多个正在运行的容器rm-于删除一个或...

docker常用指令及安装rabbitMQ(docker安装rabbitmq配置环境)

一、docker常用指令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestart...

使用Docker快速部署Storm环境(docker部署confluence)

Storm的部署虽然不是特别麻烦,但是在生产环境中,为了提高部署效率,方便管理维护,使用Docker来统一管理部署是一个不错的选择。下面是我开源的一个新的项目,一个配置好了storm与mono环境的D...

Docker Desktop安装使用指南:零基础教程

在之前的文章中,我多次提到使用Docker来安装各类软件,尤其是开源软件应用。鉴于不少读者对此有需求,我决定专门制作一期关于Docker安装与使用的详细教程。我主要以Macbook(Mac平台)为例进...

Linux如何成功地离线安装docker(linux离线安装httpd)

系统环境:Redhat7.2和Centos7.4实测成功近期因项目需要用docker,所以记录一些相关知识,由于生产环境是不能直接连接互联网,尝试在linux中离线安装docker。步骤1.下载...

Docker 类面试题(常见问题)(docker面试题目)

Docker常见问题汇总镜像相关1、如何批量清理临时镜像文件?可以使用sudodockerrmi$(sudodockerimages-q-fdanging=true)命令2、如何查看...

面试官:你知道Dubbo怎么优雅上下线的吗?你:优雅上下线是啥?

最近无论是校招还是社招,都进行的如火如荼,我也承担了很多的面试工作,在一次面试过程中,和候选人聊了一些关于Dubbo的知识。Dubbo是一个比较著名的RPC框架,很多人对于他的一些网络通信、通信协议、...

【Docker 新手入门指南】第五章:Hello Word

适合人群:完全零基础新手|学习目标:30分钟掌握Docker核心操作一、准备工作:先确认是否安装成功打开终端(Windows用户用PowerShell或GitBash),输入:docker--...

松勤软件测试:详解Docker,如何用portainer管理Docker容器

镜像管理搜索镜像dockersearch镜像名称拉取镜像dockerpullname[:tag]列出镜像dockerimages删除镜像dockerrmiimage名称或id删除...