2

我正在阅读这篇关于 socket.io 的事件和回调如何工作的有趣的介绍性文章。

我决定先尝试以下方法。

第一次尝试

服务器.js

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

客户端.js

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

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

第二次尝试

服务器.js

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

客户端.js

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

好吧,它工作得很好,但是必须添加“名称”参数和我不使用的空哈希似乎是一个不太好的解决方案。

我试图在非常 不完整的 socket.io 文档中找到对此的解释,但没有找到对这种行为的解释,这就是我在这里问的原因。

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

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

4

1 回答 1

0

空对象不一定是对象,它几乎可以是任何东西,例如字符串,甚至可能是 null(还没有尝试过)。此外,该name参数并不是专门的“名称”参数,它只是您从客户端传递的任何数据(同样,这可能是您当前正在使用的空对象,或其他任何东西)。更好的通用参数名称可能是data. 当然,您可以称其为浪费,但您传输的只是两个字符,而且大多数时候您可能会发现该数据的用途。

您传递给emit(一个函数)的第三个参数是可选的回调参数,显然,既然它正在工作,那么您使用它是正确的。

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

于 2013-05-14T23:53:39.647 回答