2012-06-20 103 views
0

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

我知道我可以做的:。 setTimeout(function(){ ... }, 4000); 但我需要一种方法来添加到这个计时器(即经t默默有1秒左右,我点击一个字段,我想让计时器回到4秒)

+0

有什么问题?你是什​​么意思*,但我需要一种方法来添加到这个计时器。* –

+0

用户如何在计算发生时做任何事情?这没有任何意义。除非通过计算你的意思是ajax请求或其他东西。 – Esailija

+0

是的,我正在使用AJAX调用MVC中的函数。该工具尝试请求计算,提供输入在客户端有效。# – JustAnotherDeveloper

回答

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()功能。不需要无休止的定时器,并且如果有计算“排队”,那么它们将在第一个计算功能停止后计算,而不是每次等待4s。当你改变你的计算功能会花费更长时间会发生什么?

希望这会有所帮助。

2

这可以通过在执行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); 
0

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

var timeoutID = null; 
if (timeoutID !== null) { 
    window.clearTimeout(timeoutID); 
} 
timeoutID = window.setTimeout(function(){ 
    // your code here 
}, 4000); 
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); 
0

正如其他人所说,clearTimeout是处理这个问题的方法。我把这个如何工作的一个非常基本的例子放在一起。点击按钮将取消并在函数运行之前重新启动计时器,但此事件可能很容易被绑定到另一个事件(如焦点或模糊场,就像它看起来会像你会这样做)

Example of delaying execution with clearTimeout here >>