zoukankan      html  css  js  c++  java
  • 防抖截流装饰器的封装

    注释

    /**

    • @example @limitFrequency('debounce') @limitFrequency('throttle')
    • @params type:String enum('debounce','throttle')
    • @params wait:Number 延迟时间默认500毫秒,也可自定义传入
    • @note 支持箭头函数的写法了,且将截流throttle函数和防抖debounce函数合二为一
    • 防抖 debounce: 任务被调用后, 在一定延迟后才执行, 若再次被调用, 则重新计算延迟时间
    • 截流 throttle: 一定时间内, 任务不管被调用多少次, 只实际执行一次
      */

    箭头函数写法

        箭头函数写法 执行函数挂在 descriptor.initializer里,执行函数为return 出来的 function,且是匿名函数
    
        descriptor.initializer = function(){
            return function(){
                console.log('执行')
            }
        }
    

    普通函数写法

        普通函数写法 执行函数挂在 descriptor.value上,执行函数就是该function
        
        descriptor.value = function(){
            console.log('执行')
        }
    

    调用方式

        //上述所说的执行函数就是fn
    
        @limitFrequency('debounce',1000)
        fn = ()=>{
            console.log('执行')
        }
    

    装饰器封装

        export function limitFrequency(type, wait = 500) {
            return function (pageInstance, funcName, descriptor) {
                let timer = null;
                let cacheValue = descriptor?.value || descriptor?.initializer()
                const callBack = (...args) => {
                    if (type == 'debounce') {
                        if (timer) {
                            clearTimeout(timer);
                            timer = null;
                        }
                        timer = setTimeout(() => {
                            cacheValue.apply(this, args)
                            clearTimeout(timer);
                            timer = null; 
                        }, wait)
                    }
                    if (type == 'throttle' && !timer) {
                        timer = setTimeout(() => {
                            cacheValue.apply(this, args)
                            clearTimeout(timer);
                            timer = null;
                        }, wait)
                    }
                };
                if (cacheValue.name == funcName) {
                    descriptor.value = callBack
                } else {
                    descriptor.initializer = () => callBack;
                }
                return descriptor;
            }
        }
    

    注意:执行完函数需清除定时器且重置标志timer的值

  • 相关阅读:
    JAVA——return浅析
    JAVA泛型【转】
    C#——WinForm修改密码
    java获取当前时间的方式【转】
    iOS 取得单张系统图片
    iOS UIView的简单渐变效果
    UIView 添加子视图的常用方法
    IOS之UIView的tag学习
    OC学习笔记之属性详解和易错点
    oc对象函数什么时候返回值类型使用instancetype
  • 原文地址:https://www.cnblogs.com/hjj2ldq/p/12752227.html
Copyright © 2011-2022 走看看