展开目录
让重复调用只有第一次生效
javascript
X
陈尼玛的博客
记录开发生涯的踩坑经历,用时间来验证成长
加载中

通常情况下,方法被调用时会立即执行。现在遇到的问题是,某一个方法在短时间内可能被多次调用,需要只有第一次执行,直到第一次执行完成之前的调用都会被忽略。

为了实现这个功能,通常做法是用一个标记变量来记录是否这个方法已被调用。写成代码是这样的:

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>

相关文档

  1. 判断变量是否 0 或者 '0'

  2. replace2正则扩展方法

  3. 简易版事件封装

  4. youku电脑版跳过广告代码

  5. 解密某个js文件

  6. 破解百度云下载链接

  7. 让js支持带命名的正则表达式

  8. jshtml模板引擎

  9. json2html源码

  10. 读取Blob的内容实体

  11. 判断一个object是否HTMLDom

  12. 简易命令行解析器

  13. Promise才是javascript的正统队列

  14. callback => Promise.then

  15. nodejs异步回调的并发控制

  16. 低版本IE命名函数表达式bug

  17. 简易JSON函数封装

  18. 使用eval来修改上下文的变量

  19. seajs同步加载依赖的实现和弊病

  20. html5页面全屏方法

  21. 给滚动条置顶添加过渡动画

  22. m秒内最多n次的问题

  23. 让代码扁平化

  24. 关于自动加载的问题

随便看看

  1. cnpm 立即同步

  2. mac ssh透过代理连接

  3. nginx 子域名对应文件夹

  4. sass变量和继承类写法

  5. mac 终端运行后台程序如何在终端关闭时继续运行

  6. nginx用域名来转发请求

  7. nodejs socks5

  8. 搜索命令整理

  9. heroku登陆cli

  10. 单页应用的单向数据流的流程图

  11. TIME_WAIT过多

  12. putty使用http代理连接服务器

  13. git配置服务端支持http认证

  14. git 设置代理服务器

  15. 把树莓派的存储空间拓展到整张TF卡中

  16. 树莓派配置收发邮件

  17. 前端性能观察器

畅言模块加载中