js 防抖函数,基于变量实现锁定,手动或自动两种方式释放锁
- 使用场景:适合点击按钮时请求接口,防止并发调用后端接口。
- 为什么会有定时器自动释放,答:1.可能会忘记释放,2.代码报错影响可能到后面锁的释放
- 实现方案
(function (){
var lockTable = [];
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;
}
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
};
})();
- 使用例子
if (window.lockTool.lock("request_api")) {
$.ajax({
...,
success(res) {
window.lockTool.unlock("request_api");
},
error(err) {
window.lockTool.unlock("request_api");
}
})
}