Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
延迟javascript函数执行_Javascript_Jquery - Fatal编程技术网

延迟javascript函数执行

延迟javascript函数执行,javascript,jquery,Javascript,Jquery,我使用的是jQuery(最新版本),有一个名为“calculate()”的函数,每次编辑字段并退出该字段(模糊等)时都会调用该函数。(允许“动态”计算) 计算需要不到4秒的时间才能完成,但如果用户在计算完成之前更改了表单上的另一个元素,则它们将排队,并在当前操作完成后再次调用该函数。 由于我无法在函数启动后停止处理,是否可以将函数延迟几秒钟,然后每次与表单元素交互时,添加到计时器中 我认为这是不可能的,但尽管我愿意试一试 我知道我能做到: setTimeout(函数(){…},4000); 但是

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

我认为这是不可能的,但尽管我愿意试一试

我知道我能做到:
setTimeout(函数(){…},4000);

但是我需要一种添加到此计时器的方法(即计时器还剩1秒,我单击一个字段,希望计时器返回到4秒)

这可以通过在执行
setTimeout()
之前调用
cleartimout()
来处理,以清除任何挂起的操作

// 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);

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

// 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);

您可以记住timeoutID,并在每次启动新计时器时重置旧计时器

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

您可以记住timeoutID,并在每次启动新计时器时重置旧计时器

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

我会这样做:

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次。当您更改计算函数时会发生什么情况,并且需要更长的时间


希望这能有所帮助。

我会这样做:

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次。当您更改计算函数时会发生什么情况,并且需要更长的时间


希望这有帮助。

您的问题不是添加计时器,而是清除上一个计时器

你可以这样做:

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);

您的问题不是添加到计时器,而是清除上一个计时器

你可以这样做:

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);

正如其他人所提到的,
clearTimeout
是处理这个问题的方法。我给出了一个非常基本的例子来说明它是如何工作的。在函数运行之前,单击按钮将取消并重新启动计时器,但这个事件很容易绑定到另一个事件(如字段上的焦点或模糊,就像您将要做的那样)


正如其他人所提到的,
clearTimeout
是处理此问题的方法。我提供了一个非常基本的示例,说明了此方法的工作原理。在函数运行之前,单击按钮将取消并重新启动计时器,但此事件可能很容易绑定到另一个事件(像场上的焦点或模糊,就像你要做的那样)


问题出在哪里?你的意思是什么?但我需要一种方法来添加到此计时器。在计算过程中,用户如何执行任何操作?这没有任何意义。除非计算是指ajax请求或其他。是的,我正在使用ajax调用MVC中的函数。该工具尝试请求提供输入在客户端是有效的。#有什么问题吗?你的意思是什么?但是我需要一种方法来添加到这个计时器。当计算发生时,用户怎么能做任何事情?这没有任何意义。除非计算是指ajax请求或什么。是的,我使用ajax在MVC中调用函数。该工具试图请求计算,前提是输入在客户端有效#