Javascript node.js socket.io计时器-单例模式?

Javascript node.js socket.io计时器-单例模式?,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我使用node.js和socket.io来显示倒计时。计时器在node.js上运行,并通过socket.io向客户端发送时间,时间使用setTimeout 问题是,对于每个连接,我实例化了一个新的原型类,该类获取时间并发出计时器,但是每个用户的时间应该是相同的。理想情况下,我会使用io.sockets.emit(与使用“socket”回调相反)。然后将时间发送到所有客户端(这是所需的行为) 现在,这将导致计时器发疯,因为每个连接的客户端都有一个新对象 在JavaScript中,单例模式是解决这个

我使用node.js和socket.io来显示倒计时。计时器在node.js上运行,并通过socket.io向客户端发送时间,时间使用setTimeout

问题是,对于每个连接,我实例化了一个新的原型类,该类获取时间并发出计时器,但是每个用户的时间应该是相同的。理想情况下,我会使用io.sockets.emit(与使用“socket”回调相反)。然后将时间发送到所有客户端(这是所需的行为)

现在,这将导致计时器发疯,因为每个连接的客户端都有一个新对象

在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();
这仍然会多次创建对象

任何建议都很好!多谢各位

Auction.instance = null;

if(!Auction.instance) {
if
子句将始终通过,因为它遵循的语句将其设置为
null
。您希望在函数外部将其设置为
null
,而不是每次创建实例时,因为这样每次执行
new
时都会清除单例


在您的情况下,您只需删除整个
null
,因为
!未定义===true

如果在客户端连接时调用
newaction
init
,则将创建多个计时器。您需要在任何连接处理程序之外执行一次


编辑:完成此操作后,还应遵循@pimvdb的建议。

Hm,因此它似乎仍在多次运行init并再次启动setTimeout。发生的事情是,那里的连接越多,计数器就越乱are@dave:您的意思是任何以下
.init()
调用都应该是无操作的吗?在这种情况下,您必须在第一次之后使用空函数覆盖
.init