【发布时间】:2014-03-16 21:07:15
【问题描述】:
我有各种客户端的套接字连接到我的服务器,我需要在每个套接字上定义一个事件,但基于一些逻辑,而不是无条件的。喜欢:
for(i= 0; i<= this.users.length; i++) {
if (i=== actionUserOrdinal) {
io.sockets.socket(mySocketId).on('action', function(action) {...
但是这样做会在运行应用程序的过程中为某些套接字定义多次。因此,它也被多次调用(由同一个触发器)。
如果我将其定义为默认方式,
io.sockets.on('connection', function(socket) {
socket.on('action', function(data) {
...
我无法访问我的主应用程序逻辑的变量等。除非我让一些东西全球化。
我想到的一个解决方案是在事件触发后删除它
for(i= 0; i<= this.users.length; i++) {
if (i=== actionUserOrdinal) {
thisocket = io.sockets.socket(mySocketId);
io.sockets.socket(mySocketId).on('action', function(action) {
delete thisocket._events.action;
(感谢@ArdiVaba)
但我发现这是不稳定的,有时该事件仍会被触发两次。
是否有其他方法来定义事件,这样它不会被多次定义,要么在我的主应用程序的逻辑中定义它,要么在它的默认范围内定义它,但我仍然能够访问我的主应用程序的变量没有全局化?
【问题讨论】:
-
做:console.log(io.sockets.socket);然后你会看到socket的内部。某处有所有已定义事件的属性。然后,您可以只使用该信息来不定义某些内容。 (可选地,您可以代理 .on 函数进行检查,这样您就不必更改任何现有代码)。您必须对 .on 函数进行深层复制,并将其存储在您的代理函数中。当代理函数被调用时,它会检查已经存在的事件,如果没有任何东西,你只需调用 .on 函数的深拷贝版本,否则你会从它返回。