2012-03-27 36 views
0

我使用node.js和socket.io來顯示倒數計時器。定時器正在node.js上運行,並通過socket.io向客戶端發送時間,時間正在使用setTimeout。node.js socket.io定時器 - 單例模式?

問題是,對於每個連接,我正在實例化一個新的原型類,它獲取時間並釋放計時器,但時間對於每個用戶都應該是相同的。理想情況下,我會使用io.sockets.emit(反對使用'套接字'回調)。然後時間將被髮射到所有客戶端(這是所需的行爲)。

現在,這會導致定時器發瘋,因爲每個連接的客戶端都有一個新的對象。

在JavaScript中,單例模式是否可以解決這個問題?

我試圖用這個,但似乎並沒有工作:

var Auction = function() { 

    Auction.instance = null; 

    if(!Auction.instance) { 
     Auction.instance = this; 
    } else { 
     console.log('instance'); 
     return Auction.instance; 
    } 

} 

Auction.prototype = { 

    init: function() { 
     //setTimeout is defined here, along with a lot of other stuff 
    }; 

} 

我叫它做:

var auction = new Auction; 
auction.init(); 

這仍然創建對象多次。

任何建議將是偉大的!謝謝。

回答

1
Auction.instance = null; 

if(!Auction.instance) { 

if子句將始終通過,因爲它遵循的語句將其設置爲null。您希望將其設置爲null一次,而不是每次創建實例時都這樣,因爲每次執行new時都要清除單例。

對於您的情況,您可以從!undefined === true以上消除整個null的事情。

+0

嗯,所以它似乎仍然在多次運行init並再次啓動setTimeout。發生什麼事是計數器堅持更多的連接 – dzm 2012-03-27 21:39:17

+0

@dave:你的意思是任何後續的'.init()'調用應該是no-ops?在這種情況下,你必須在第一次之後用空函數覆蓋'.init'。 – pimvdb 2012-03-27 21:42:10

1

如果您在客戶端連接時致電new Actioninit,那麼您將創建多個定時器。您需要在任何連接處理程序之外執行此操作。

編輯:一旦你這樣做了,你也應該遵循@ pimvdb的建議。