2012-03-16 42 views
2

我使用Node.js與socket.io並有定時器的setInterval。確保setInterval不重複本身

我有以下的地方。我在斷開連接時清除間隔,並在設置間隔之前檢查。但是,如果我刷新頁面很多,它似乎不準確。控制檯日誌會以比一秒鐘快得多的時間間隔顯示「時間」,並將它們組合在一起。

任何建議,以確保一個新的計時器永遠不會啓動超過一次?

socket.on('disconnect', function() { 
    console.log('Disconnected'); 
    clearInterval(timer); 
}); 

if (typeof timer != 'undefined') { 
    clearInterval(timer); 
} 

var timer = setInterval(function() { 
    console.log('time'); 
}, 1000); 
+0

您可能需要發佈更多代碼才能看到問題。 – david 2012-03-16 18:28:54

+0

所以......你只想執行一次......但是你正在使用'setInterval',它被設計用來執行一段代碼......每一個間隔。使用'setTimeout'。 – 2012-03-16 18:55:39

回答

8

任何建議,以確保新的計時器不會啓動不止一次?

這正是setTimeout()呢......

如果你也許意味着「不止一次每秒你需要知道的是setInterval()將導致事件疊加起來,如果他們沒有及時處理。這將是什麼導致你的差距不到一秒鐘。

唯一的答案是在超時處理程序本身內使用setTimeout()啓動一個新的一次性定時器。在其自己的回調中遞歸調用setTimeout可確保一次只有一個計時器事件置於事件隊列中。

+0

不! 'setTimeout'只執行一次。而'setInterval'每個時間段執行! – 2012-03-16 15:24:19

+1

@PashaRumkin這正是我的觀點。 OP要求**不會啓動一次以上**。 'setTimeout()'啓動一次,因此滿足這個要求。 – Alnitak 2012-03-16 15:27:11

+0

是的,我的錯) – 2012-03-16 15:34:04

-1

頁面重新加載會殺死所有計時器。問題出在瀏覽器上:當你創建1秒的時間間隔,並致電alert Mozilla的SpiderMonkey間隔事件在警報爲已關閉後變爲1秒,而Google V8在警報爲之後1秒鐘運行,稱爲。 這是關於引擎中不同的代碼流組織。

+0

此計時器未在瀏覽器中運行,它在節點服務器上運行 – david 2012-03-16 18:27:25