js 防抖函数

js 防抖函数,基于变量实现锁定,手动或自动两种方式释放锁

  1. 使用场景:适合点击按钮时请求接口,防止并发调用后端接口。
  2. 为什么会有定时器自动释放,答:1.可能会忘记释放,2.代码报错影响可能到后面锁的释放
  3. 实现方案
(function (){
 //加锁信息
    var lockTable = [];//将锁的信息列表
    /**
    * lockkey 锁的key值
    * second 锁定多少秒自动释放
    * freeCallback 自动释放回调通知函数
    */
    function lock(lockKey,second = 5,$freeCallback = null) {
        if (isNaN(second) || second < 1) {//锁定时间
            return false;
        }
        if (!lockTable instanceof Array) {
            return false;
        }
        var index = -1;
        for(var i = 0; i < lockTable.length; i++) {
            if (lockKey === lockTable[i].key) {
                index = i;
                break;
            }
        }
        if (index === -1) {
            index = lockTable.length;
            lockTable.push({
                key : lockKey,
                timerId : -1
            });
        }
        if (lockTable[index].timerId !== -1) {
            return false;
        }
        lockTable[index].timerId = setTimeout(function (){
            if (typeof $freeCallback === 'function') {
                $freeCallback(lockKey,1);
            }
           lockTable[index].timerId = -1;
           if (typeof $freeCallback === 'function') {
                $freeCallback(lockKey,2);
            }
        }, second * 1000);
        return true;
    }

    /**
    * 解锁函数
    * lockKey 锁的key值
    */
     function unlock(lockKey) {
        if (!lockTable instanceof Array) {
            return false;
        }
        var flag = false;
        for(var i = 0; i < lockTable.length; i++) {
            if (lockKey === lockTable[i].key && lockTable[i].timerId !== -1) {
                clearTimeout(lockTable[i].timerId);
                lockTable[i].timerId = -1;
                flag = true;
                break;
            }
        }
        return flag;
    }
	//对外调用变量
	window.lockTool = {
		lock,
		unlock
	};
})();

  1. 使用例子
	if (window.lockTool.lock("request_api")) { //请求前加锁
		$.ajax({
		...,
		success(res) {
			window.lockTool.unlock("request_api");//请求结束手动释放锁
		},
		error(err) {
			window.lockTool.unlock("request_api");//请求结束手动释放锁
		}
		})
	}
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值