正确使用socket.io事件的回调

时间:2013-05-14 22:28:36

标签: javascript node.js socket.io

我正在阅读关于socket.io的事件和回调如何工作的this interesting introductory article

我决定先尝试以下内容。

首先尝试

server.js

// client is the socket for the client
client.on('foo' , function(callback){
  callback("Hello world");
});

client.js

// server is the socket for the server
server.emit('foo', function(msg){
  alert(msg);
});

嗯,事实上它实际上不起作用(服务器抛出一个异常,告诉callback不是一个函数)。试图解决这个问题,我发现this answer解释了如何以正确的方式做到这一点。好吧,那也没办法。一些修改,我得到了...

第二次尝试

server.js

// client is the socket for the client
client.on('foo' , function(name, callback){
  callback("Hello world");
});

client.js

// server is the socket for the server
server.emit('foo',{},function(msg){
  alert(msg);
});

嗯,它完美无缺,但是必须添加“name”参数和我不使用的空哈希似乎是一个不太好的解决方案。

我试图在amazingly incomplete socket.io的文档中找到对此的解释,但没有找到这个beheaviour的解释,这就是我在这里问的原因。

我的另一个疑问是,是否可以对另一方做同样的事情(即服务器向客户端发送回调,然后在服务器中执行回调),但我还没有尝试过

TL; DR :为什么第一次尝试不起作用,第二次尝试不起作用?有没有办法避免那个无用的空哈希和name参数?这两种方式的工作原理是否相同? (服务器→客户端和客户端→服务器)。

1 个答案:

答案 0 :(得分:0)

空对象不一定是对象,它实际上可以是任何东西,例如字符串,甚至可能是null(没有尝试过)。此外,name参数并非特定的“名称”参数,它只是您从客户端传递的任何数据(同样,这可能是您当前使用的空对象,或其他任何内容)。更好的通用参数名称可能是data。当然,你可以把它称为浪费,但它只是你要转移的两个字符,而且大多数时候你可能会找到这些数据的用途。

你传递给emit(函数)的第三个参数是可选的回调参数,显然,因为它正在工作,你正确使用它。

至于反方向,我从未尝试过。它可能会工作,但即使它不工作,您所要做的就是发送一个唯一的ID以及每个推送事件,然后让客户端使用该ID将事件发送回服务器,然后写一些服务器上的代码,用于将该事件与原始推送事件重新关联。您甚至可以在每个套接字上使用计数器作为推送ID,然后使用socket.idevent.id的组合作为唯一标识符。