JS经常会遇到延迟执行的动作,并且失败后自动尝试,尝试N次之后就不再尝试的需求,今天刚好又遇到,于是写个闭包,以后不断完善继续复用。
用法:
// 检查并计数
// 第一个参数用来标记是尝试哪个动作的,第二个参数是最大尝试次数
// 返回 true表示未达到最大值 false表示超过最大值
Counter.check('play', 3); // 执行前3次返回true,第4次返回false,第5次返回true开始新循环...
// 计数器清0,执行成功后清空计数
// 第一个参数是标记
Counter.reset('play');
// 查看计数器值
// 第一个参数是标记
Counter.see('play');
我的使用例子:
function action() {
// do something or check something
if (success || ready) {
// 成功后清空计数器
Counter.reset('play');
return true;
}
// 重试次数超过10次 则 返回结束
if (! Counter.check('play', 10)) return false;
// 重试次数少于等于10次 则 500毫秒后继续尝试
setTimeout(function(){
action();
}, 500);
return false;
}
源码:
var Counter = (function () {
var flagArr = [], countArr = [];
var getIndex = function (flag) {
let index = flagArr.indexOf(flag);
if (index == -1) return flagArr.push(flag) - 1;
return flagArr.indexOf(flag);
}
return {
check: function (flag, max) {
let index = getIndex(flag)
if (countArr[index] == undefined) countArr[index] = 0;
countArr[index] ++;
if (countArr[index] > max) countArr[index] = 0;
return Boolean(countArr[index]);
},
reset: function (flag) {
countArr[getIndex(flag)] = 0;
},
see: function (flag) {
let index = getIndex(flag);
return (countArr[index] == undefined) ? 0 : countArr[index];
}
}
})();