通常情况下,方法被调用时会立即执行。现在遇到的问题是,某一个方法在短时间内可能被多次调用,需要只有第一次执行,直到第一次执行完成之前的调用都会被忽略。
为了实现这个功能,通常做法是用一个标记变量来记录是否这个方法已被调用。写成代码是这样的:
function callee(){
if(callee.run)return;
callee.run=true;
// 实际需要执行的代码
};
虽然在原始对象上绑定额外属性并不是一个好的做法,但是目前es6的WeakMap还有太多古老的浏览器不支持,所以这个做法也是无奈之举。
我封装了一个lock方法,以便在项目中使用。实例代码:
<meta charset='utf-8' />
<script>
/* 如果方法未锁定,把args作为参数传递给handler执行,并且锁定handler
如果已锁定,则忽略本次调用,并且执行fail方法
*/
function lock(handler,args,fail){
if(handler.locked)return fail && fail();
handler.locked=true;
return handler.apply(this,args);
}
// 解除方法锁定
function unlock(handler){
handler.locked=false;
}
function callee(i){
console.log(i);
setTimeout(function(){
unlock(callee);
},0);
}
for(var i=0;++i<99;)
lock(callee,[i],function(){
console.warn('本次执行被忽略');
});
setTimeout(function(){
lock(callee,[-1]);
},1000);
</script>
相关文档
随便看看
畅言模块加载中