前端关于防抖和节流

Posted liuyuexue520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端关于防抖和节流相关的知识,希望对你有一定的参考价值。

防抖

用户短时间内触发相同的网络请求, 我们限制请求次数, 减轻服务器之间的压力, 就叫防抖

举例来说: 某购物商城上面搜索框的智能提示, 用户输入东西之后, 会很快向服务器发送请求, 如果监听input事件而不做防抖操作,发送请求频率就会很频繁, 从而造成服务器压力过大

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>防抖</title>
</head>

<body>
    <input type="text" id="ipt">

    <script>
        const ipt = document.querySelector("#ipt");

        ipt.addEventListener("input", ev => {
            debunceAjax(ev.target.value);
        })

        function ajax(val) {
            console.log(val);
        }

        let debunceAjax = debunce(ajax)

        function debunce(cb) {
            return function (val) {
                clearTimeout(cb.timer);
                cb.timer = setTimeout(() => {
                    cb(val)
                }, 1000)
            }
        }

    </script>
</body>

</html>

防抖的核心是通过定时器来添加延迟, 从而延迟 网络请求的调用, 当用户短时间再次触发的时候 , 先清除该定时器 , 定时器如果时间没到 , 里面的网络请求就不会发送出去 , 随着清除定时器 一起释放了 , 网络请求自然就减少了

 

 

 

节流

所谓的节流, 主要是游戏用的多, 例如 英雄联盟 平A补刀, 假设用户点 A 就会发送请求, 那么, 只要这个人手速够快, 一秒钟点个十来次A, 英雄是否就会A 10刀呢?  其实不然, 无论该用户点击 A 多频繁, 英雄都只会在一定间隔内攻击一次, 这就是节流操作

在相同的事件内, 当前事件触发后, 用户再次触发该事件, 就会失效, 直到设置的节流时间 过 , 用户才能再次触发该事件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <button id="btn">节流使用</button>

    <script>
        const btn = document.querySelector("#btn");
        btn.onclick = () => {
            fnAjax()
        }

        const ajax = () => {
            console.log("123")
        }

        const fnAjax = fn(ajax, 2000)


        function fn(cb, delay) {
            cb.flag = true
            return function () {
                if (cb.flag) {
                    cb.flag = false;
                    setTimeout(() => {
                        cb()
                        cb.flag = true
                    }, delay)
                }
            }
        }


    </script>
</body>

</html>

节流的核心, 同样是通过定时器, 来延迟发送网络请求的时间 , 和 防抖 的区别在于, 节流是通过 变量的布尔值 来控制 请求的时间间隔

 

以上是关于前端关于防抖和节流的主要内容,如果未能解决你的问题,请参考以下文章

关于防抖和节流

前端的防抖和节流

lodash的防抖和节流方法

前端防抖和节流

前端防抖和节流

前端防抖和节流