2012-08-23 42 views
0

我使用遞歸一個定時器,模擬的setInterval,同時防止它在自身上,例如運行:clearSetTimeout,防止setTimeout的公司從堆放

this.poll = function() { 
    var self = this; 
    if(self.timeout) { 
      clearTimeout(self.timeout) 
    } 
    self.timeout = setTimeout(function(){ 
     self.request(); 
    }, 1000); 
} 

self.request();包含AJAX邏輯並調用this.poll()

問題是,當this.poll被再次調用時,它似乎沒有真正清除超時,並且最終導致大量請求相互重疊。

有沒有更好的方法來處理這個問題?

謝謝!

+1

'self.request();包含ajax邏輯並調用this.poll()' - 請求'立即調用'poll',還是在其Ajax回調中調用?如果它立即執行,那麼我希望你最終會得到大量的請求,因爲'request'產生了一個新的Ajax請求,然後立即排隊一個新的請求在下一秒運行,可能在舊請求之前已解決。 (除非你的意圖實際上是每隔一秒輪詢一次)。 – apsillers

+0

'request'在ajax回調中調用'poll',意圖是每秒運行一次。但是現在,如果我刷新頁面幾次,我會在開始時收到一些請求。 – dzm

+1

如果刷新頁面,則會導致超時,從而清除JavaScript。你所看到的是來自上一頁加載的舊請求。 – epascarello

回答

0

爲什麼模仿setinterterval而不是使用標誌來防止同時運行兩次?

this.poll = function(){ 
    if(this.running) return; 
    this.running = true; 
    var self = this; 
    setIntervar(function(){ 
    var callback = function(){ 
     //your stuff 
     self.running = 0; 
    }; 
    self.request(.....,callback); 
    },1000) 
}