杀死Javascript函数或制作Function Singleton

时间:2014-02-19 23:59:51

标签: javascript

有没有办法杀死正在运行的JavaScript函数?

或者确保一次只运行一个函数副本并重新启动上一个调用实例的方法将被删除。

例如,如果我打电话

_.defer(heavyDutyPaint);  //How to kill this when a second one is called?
_.defer(heavyDutyPaint);  

截至目前,我已将一个令牌分配给函数调用。只有令牌功能的当前值才能在屏幕上绘画。

类似于以下内容 -

var token;

function heavyDutyPaint(){
     var localToken = Math.floor((Math.random()*10000)+1);
     token = localToken;

     //perform a time consuming read
     var results = getResults();

     if(token === localToken){
          paintScreen(results);
     }
}

function defer(method){
    setTimeout(method, 1);
}

defer(heavyDutyPaint);
defer(heavyDutyPaint);

这是确保只有最新的被叫方才能访问某些资源/服务的唯一方法。

更多信息 - 用于getResults方法。它执行一些REST调用,这不会发生多次。有一个单独的逻辑来管理它。该方法虽然做了一定的计算。 而且我不是要求基于锁定的解决方案作为回答。我问是否有办法杀死,停止执行。或以某种方式标志。 我实际上希望第二个完成它的任务而不是第一个任务。考虑这些方法,如过滤器。最新请求的过滤器是有用的。

1 个答案:

答案 0 :(得分:0)

您可能想要这样做:

function heavyDutyfunction = (function() {
  var lock = false;
  return function() {
    if(!lock) {
      lock = true;
      requestAnimationFrame(function() {
        // we do the work here
        lock = false;
      });
    }
  };
}());
heavyDutyFunction();
heavyDutyFunction(); // this call will like be passed over

这会在您的重型功能范围内创建一个lock var,从外部无法触及,并且可防止多个呼叫在前一个呼叫运行时通过。也就是说,通过同步回调通常可以更有效地完成重载函数,以便尽可能释放JS线程。