2012-09-24 40 views
1

我的頁面上有一個<div>,每兩分鐘自動更新一次更新的日誌條目。當我第一次加載我的網頁時,我會調用以下函數。JavaScript:window.setTimeout(),強制提前過期

function getLogs() { 
    var filter = $('#filter').val(); 
    $.get("index-ajax.asp", { queryType: "getLogs", filter: filter, 
     uTime: new Date().getTime() }, 

     function(data){ 
      $("#logEntries").html(data); 
      window.setTimeout("getLogs()",120000); 
    }); 
} 

我知道上面的代碼可以用window.setInterval(...);更清潔,但我只是喜歡的window.setTimeout(...);控制。

我的問題是否可以取消下一個超時執行?如果我更改過濾器,我想取消下一個超時,並立即調用該函數,這將重新計劃超時函數。有沒有更好的方法來實現這一結果?

請注意,上面的代碼是在jQuery中。

+7

注意:Do * NOT *將字符串傳遞給'setTimeout',它使用'eval'!傳遞函數。 'window.setTimeout(getLogs,120000);' –

+0

@RocketHazmat感謝提示字符串。 – dangowans

回答

7

是的,請使用clearTimeout

例:

var clr = window.setTimeout(getLogs,120000); 

的,當你婉清除:

clearTimeout(clr); 
+2

P.S.不要將字符串傳遞給'setTimeout'。 –

+0

@RocketHazmat - 正確,良好的捕捉。我甚至沒有證明代碼。更新。 – j08691

+1

還有一個'clearInterval'函數,但是你可以使用'clearTimeout',它可以正常工作。 –

3

setTimeout返回timerID可以傳遞到clearTimeout

// Note we are passing the *function* rather than a string 
// Also note the lack of() - we are *not* calling the function 
// setTimeout will do that for us 
var timerID = setTimeout(getLogs, 120000); 
// Fake condition - we cancel the timer if the timerID is even 
if (timerID % 2 === 0) { 
    clearTimeout(timerID); 
} 
0

你總是可以定義基於過濾器值的新變量以及該過濾器值使用while語句省略超時時間:

if(filter == "whatevs"){ 
    var i=true; 
} 
function(data){ 
    $("#logEntries").html(data); 
    while(i!=true){ 
     window.setTimeout("getLogs()",120000); 
    } 
}