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