网络优化-函数防抖与函数节流

147 阅读2分钟

一、函数防抖

大家会发现,在某东搜索框搜索商品时,每当你输入一个字符,就会有相应的商品提示: image.png

这种情况本质上就是网页把你输入的字符向服务器提交了,然后服务器做出推测;但是如果用户每输入一个字符就提交一次,客户端和服务器端就会发生非常频繁的无效交流,在客户端网络资源有限的情况下容易影响客户体验,同时也加大了服务器的负荷;

服务器: image.png

于是,函数防抖,应运而生。

函数防抖,即单位时间内,频繁触发事件,只会触发最后一次。

以上例搜索框提交网络请求为例,若我们规定在0.5s内,只会提交用户最后输入的信息来做检索推测,即可大幅度避免网络资源浪费,提升网络效率;同时减小服务器负荷。

思路:

1、声明全局变量存储定时器ID

2、每一次触发事件, 先清除上一次定时器。 然后将事件处理代码放入本次定时器中

3、定时器结束时处理事件

<body>
  <input type="text">
  <script>
    let timeID = null
    document.querySelector('input').addEventListener('input', function () {
      clearTimeout(timeID)
      timeID = setTimeout(() => {
        //在这里指代提交网络请求
        console.log(this.value)
      }, 200)
    })
  </script>
</body>

二、函数节流

目的和函数防抖一样,都是为了避免网络资源浪费,提高网络效率以及用户体验; 但不同的是,函数防抖是取单位时间内最后一次的事件触发,而函数节流则是单位时间内,频繁触发事件,只会触发一次。

思路:

1、声明一个开关

2、触发事件的时候,判断开关

3、事件触发后设置开关为false,并设置定时器

4、定时器结束时,设置开关为true

  <script>
    let flag = true
    let i = 1
    window.onmousemove = function () {
      if (flag) {
        flag = false
        //在这里指代提交网络请求
        console.log(`滚动触发次数${i++}`)
        setTimeout(() => {
          flag = true
        }, 1000);
      }
    }
  </script>

和函数防抖不同,函数节流的使用频率较低