2012-06-20 101 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 >>