• 前端性能优化--:(Debounce)与节流(Throttle)


    这周公司对其项目要进行一些性能优化,所以记录一下

    防抖(Debounce)和节流(Throttle)都是用来控制某个函数在一定时间内执行多少次的技巧,

    针对于公司的这个项目,我顺便解释下它们之间的区别:
    防抖:
          比如在加入购物车的时候,后端服务器卡了一下,你连续点击了2次,两条都过去了,后端的数据来不及生成,导致两条一样的数据在数据库
    (前端传过来的id,后端要先根据id去进行find操作,要是没有这个数据就create一条,要是有的话就update一下数量。
    如果服务器卡了一下的话,连续2次点击,第一条都来不及反应,就都会执行created操作,就创建了2条数据,
    其实实际要是一开始没有的话只需要创建1条,再有的话就update下条数就行了)
    
    节流:
          比如在秒杀的时候,一下会点击好多次,这样会给服务器端造成很大的压力,就会设定你点一次之后,再点击是不生效的,下次要等1s之后点击才会执行
    
    

    方法一:

    防抖(Debounce)

    在函数被触发n秒后再执行,如果在n秒内又有函数执行,则重新计算。

    我们在做搜索功能的时候,如果每输入一个字符就调用一次接口,会导致请求过于频繁。
    但这些请求中,只有最后一个请求是有意义的,因为最后一个请求发出时,我们已经输入了完整的搜索词,
    而前面没有意义的请求,是对网络资源的浪费。此时就可以使用debounce,把触发非常频繁的事件合并成一次执行。

    实现思路

    /**
    * @fn : 要执行的函数
    * @delay : 执行函数的时间间隔
    */ 
     
    function debounce(fn,delay){
        let timer; // 定时器
        return function(...args){ // 形成闭包     
            // args 为函数调用时传的参数。
            let context = this; 
            timer&&clearTimeout(timer); // 当函数再次执行时,清除定时器,重新开始计时
            // 利用定时器,让指定函数延迟执行。
            timer = setTimeout(function(){
                // 执行传入的指定函数,利用apply更改this绑定和传参
                fn.apply(context,args);
            },delay)
        }
    }
    

    使用

    debounce(doSomething,200);
    

    节流(Throttle)

    允许一个函数在 X 毫秒内只执行一次。

    当你需要监听滚动条变化,从而去计算页面中某个元素到窗口顶部距离的时候。
    可以使用Throttle,不用实时去计算元素的位置,而是一段时间计算一次,可以避免频繁执行代码,防止浏览器频繁响应事件,严重拉低性能。

    /**
    * @fn : 要执行的函数
    * @delay : 每次函数的时间间隔
    */  
    function throttle(fn,delay){
        let timer;    // 定时器
     
        return function(...args){
            let context = this;
            // 如果timer存在,说明函数还未该执行
            if(timer) return;
            timer = setTimeout(function(...args){
                // 当函数执行时,让timer为null。
                timer = null;
                fn.apply(context,args);
            },delay);
        }
    }
    

    使用

    throttle(doSomething,200);
    

    方法二:

    使用Lodash插件

    Lodash是一个javascript 工具库,它内部封装了诸多对字符串、数组、对象等常见数据类型的处理函数。

    可以直接使用 Lodash 的自定义构建工具,调用_.debounce 和_.throttle 方法。

    1、安装插件:
          npm i --save lodash
    
    2、在要用到防抖节流的页面引入:
          import _ from 'lodash'
    
    3、写入:
          _.debounce(doSomething, 200);
          _.throttle (doSomething, 200);
    
  • 相关阅读:
    NOJ 1116 哈罗哈的大披萨 【淡蓝】 [状压dp+各种优化]
    Codeforces Round #278 (Div. 2) B. Candy Boxes [brute force+constructive algorithms]
    noj 2069 赵信的往事 [yy题 无限gcd]
    noj 2068 爱魔法的露露 [线性扫一遍]
    Codeforces Round #275 (Div. 2) B. Friends and Presents 二分+数学
    Word2007文档中怎么输入上标下标
    Linux下查找命令
    矩阵求逆
    LRC算法在人脸识别中应用
    java从txt文档读写数据
  • 原文地址:https://www.cnblogs.com/wufenfen/p/13883509.html
Copyright © 2020-2023  润新知