2012-04-01 71 views
2

我的ASP.NET MVC頁面使用JavaScript/jQuery來每秒輪詢我的數據庫。防止JavaScript定時器重新輸入

這是工作,但我想確保,如果有一個延遲,我的計時器處理程序不會再被調用之前,它已經返回。

除了將定時器ID存儲在全局變量中,清除我的處理程序中的定時器以及在處理程序完成時重新啓動定時器之外,還有其他技巧。

注意:我意識到每一秒似乎都很頻繁,但此代碼在提交信用卡付款後輪詢我的服務器。通常情況下,它只會運行一秒左右,我不希望用戶等待超過必要的時間。

回答

5

每秒輪詢一次?這很重!

另外,當使用setTimeout而不是setInterval時,您將不會遇到此問題。後者確保一段代碼在給定的時間間隔內運行x次,而前者確保延遲至少x毫秒。

function some_poller() { 
    $.ajax({ 
     url: '/some_page', 
     success: function() { 
      setTimeout(some_poller, 1000); 
     }, 
     error: function() { // Also retry when the request fails 
      setTimeout(some_poller, 1000); 
     } 
    }); 
} 

// Init somewhere 
some_poller(); 
+0

我需要繼續運行該代碼,直到得到結果或者等待時間過長。我糾正'setTimeout'只調用一次目標,然後清除該函數使用的任何內部定時器?換句話說,我可以使用它,但是每次調用處理程序時我都必須再次調用'setTimeout'? – 2012-04-01 20:16:22

+0

@JonathanWood'setTimeout'不會清除任何東西,因爲它應該運行一次**函數**。另一方面,'setInterval'確保給定的函數被定期執行。如果您仍然感到困惑,請閱讀鏈接的文檔。 – 2012-04-02 17:49:45

1

不是真的,雖然我不會推薦使用全局變量。把它放在一些功能裏面。

但是你真的確定需要每秒輪詢一次嗎?這是一個非常健談的界面。

0

根據我個人的經驗,「全局」(在根函數內部)變量在這種情況下工作得非常好,因此您可以控制何時清除和重新啓動。如果回覆真的如你所說的那麼快,這不會造成太多的開銷(清除/重置),並且會考慮到這些類型的情況。