延迟javascript函数执行

时间:2012-06-20 15:36:46

标签: javascript jquery

我正在使用jQuery(最新版本),并且有一个名为“calculate()”的函数,每次编辑一个字段并退出字段(模糊等)时都会调用它。 (允许“动态”计算“) 计算完成时间不到4秒,但如果用户在计算完成之前更改了表单上的另一个元素,则它们将排队,并在当前操作完成后再次调用该函数。 由于我无法在启动时停止处理该函数,是否可以将函数延迟几秒钟,然后每次与表单元素进行交互时,都会添加到计时器中。

我不认为这是可能的,但是我会试一试。

我知道我能做到: setTimeout(function(){ ... }, 4000); 但我需要一种方法来添加到这个计时器。 (即计时器还剩1秒,我点击一个字段,我希望计时器回到4秒)

5 个答案:

答案 0 :(得分:1)

这可以通过在执行clearTimeout()之前调用setTimeout()来清除任何待处理的操作来处理。

// Declare the variable that holds the timeout pointer at a higher scope
var ts;

// in your onblur
// clear any pending pointer
if (ts) window.clearTimeout(ts);
// then reset the timeout and assign its handle to the same variable ts
ts = window.setTimeout(function() {}, 4000);

答案 1 :(得分:1)

我会做的是这样的事情:

var isCalculating = false;
var calculateQueue = false;

function calculate(){
  isCalculating = true;

  // do calculations

  isCalculating = false;

  if(calculateQueue){
    calculate();
  }
}

$('element').blur(function(){
  if(!isCalculating){
    calculate();
  }
  else{
    calculateQueue = true;
  }
});

这样您就不会运行并发calculate()函数。不需要无限的计时器,如果有计算“排队”,那么它们将在第一个计算功能停止后计算...而不是每次等待4次。更改计算功能会发生什么情况需要更长时间?

希望这有帮助。

答案 2 :(得分:1)

您的问题不是添加到计时器,而是清除以前的计时器。

你可以这样做:

var delay = (function() {
    var time_id;
    return function(callback, ms) {
      if (time_id) {
         window.clearTimeout(time_id);
      }
      time_id = window.setTimeout(callback, ms);
  };
}());

// use it like
delay(function(){...}, 4000);

答案 3 :(得分:0)

您可以记住timeoutID并在每次开始新计时时重置旧计时器。

var timeoutID = null;
if ( timeoutID !== null ) {
  window.clearTimeout( timeoutID );
}
timeoutID  = window.setTimeout( function(){
  // your code here
}, 4000 );

答案 4 :(得分:0)

正如其他人所说,clearTimeout是解决这个问题的方法。我总结了一个如何运作的基本例子。单击该按钮将取消并在函数运行之前重新启动计时器,但此事件很容易绑定到另一个事件(如字段上的焦点或模糊,就像您将要执行的那样)

Example of delaying execution with clearTimeout here >>