!!!重要
鼠标的移动,窗口的缩放,input文本框的输入,scroll这些场景都是需要通过防抖或者节流
来降低频率的
业务:不能频繁的登录或者发送验证码请求
下面的这些场景如果改变就发送ajax请求的话,就是太频繁的所以,就需要降低一改变就发送
ajax请求的频率,
image.png
image.png
采取的办法就是通过防抖和节流来降低它们发送ajax请求的频率

防抖示意图(debounce)

image.png

防抖和节流应用的举例

举例用户在input框中输入内容的时候,一输入立马就给后台发送一次ajax请求太频繁了需要降低这种一输入就发ajax请求的频率(防抖和节流)
image.png
image.png

解决方法1————————-防抖

  1. //给输入框绑定了input事件(input一改变就执行一个回调函数)
  2. //在methods中定义对应的回调函数(这里的是change和封装发送同步ajax的回调函数doAjax)
  3. //在data中定义一个timer变量 timer:null
  4. import {getSuggestion} from '../index.js'//导入封装好的发送ajax请求的函数
  5. change(){
  6. this.timer&&clearTimeout(this.timer)
  7. this.timer=seTimeout(()=>{
  8. this.doAjax
  9. },200)
  10. }
  11. //同时封装一个发送同步ajax的函数等待调用(通过async和await就能实现同步发送ajax也就是等待ajax
  12. 执行完,在去执行下面的代码)
  13. doAjax(){
  14. try{
  15. //使用发送ajax请求的函数
  16. const res=await getSuggestion(this.keyword)
  17. } catch(err){
  18. consolr.log(err)
  19. }
  20. }
  21. 防抖的实现原理:就好比坐电梯----,因为input输入事件在这个例子中绑定的一个change()事件
  22. 就表示只要input中的内容发生了变化,就会执行这个change回调,第一次内容发生改变,因为没有
  23. setTimeout定时器的执行,所以,就不会执行this.timer&&clearTimeout(this.timer)也就是清除
  24. 定时器,这个定时器会在200毫秒后执行,但是如果在200毫秒内input中的内容又发生了变化,就会
  25. 再次执行change这个回调函数,这个时候this.timer&&clearTimeout(this.timer)就会执行了
  26. 因为在200毫秒内这个回调函数还没有执行,this.timer就有值了,就为真,就会执行后面的clearTimeout(this.timer)
  27. 也就是会把之前的setTimeout()定时器,停止掉,也就是之前定时器准备发送ajax请求就不会发送了,
  28. 执行清除完之前的定时器,就又往下走执行一个新的定时器。(如果200毫秒内再次发送input输入事件,就会
  29. 再次清除前一个定时器,开启一个新的定时器,如果200毫秒内没发生input输入事件,就去发送ajax
  30. 这就是防抖通过定时器,就降低input内容一变化就发送ajax的情况(降低了发送ajax的频率)

解决方法2——————-节流

  1. //给输入框绑定了input事件(input一改变就执行一个回调函数)
  2. //在methods中定义对应的回调函数(这里change)
  3. //在data中定义一个起始的时间定义为0
  4. startTime:0
  5. import {getSuggestion} from '../index.js'//导入封装好的发送ajax请求的函数
  6. change(){
  7. const dt=Date.now()//获取当前的时间
  8. //500这个值表示的是如果间隔大于500毫秒才会去执行里面的代码
  9. if(dt-startTime>500){
  10. //调用下面的发送ajax请求的函数
  11. this.doAjax()
  12. //表示:把这次点击的时候的时间赋值给起始时间,下次再触发这个change函数,就会用
  13. 下次点击的时间减去起始的时间(也就是减去上一次点击的时间,因为上一次点击的时间赋值给了初始时间了)
  14. this.startTime=dt
  15. }
  16. }
  17. async doAjax(){
  18. try{
  19. const res=getSuggestion(this.keyword)
  20. }catch(err){
  21. console.log(err)
  22. }
  23. }