正确使用socket.io事件的callback

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

我决定先尝试一下如下的东西。

第一次尝试

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); }); 

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

第二次尝试

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); }); 

那么,它完美的作品,但不得不添加“名称”参数,而我不使用空的散列似乎是一个不太好的解决scheme。

我试图在这个令人吃惊的 不完整的 socket.io的文档中find这个解释,但没有find这个beheaviour的解释,这就是我在这里问的原因。

另一个疑问是,如果有可能对另一端(即服务器发送到客户端的callback,然后在服务器上执行callback服务器),但我还没有尝试过。

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

空对象不一定是一个对象,它几乎可以是任何东西,比如一个string,或者甚至可以是null(没有尝试过)。 另外, name参数并不是特定的“name”参数,它只是您从客户端传递的任何数据(也可以是您当前使用的空对象或其他任何内容)。 一个更好的通用参数名称可能是data 。 当然,你可以称之为浪费,但是只有两个angular色是你转移的,而且大多数情况下你可能会发现这些数据的用途。

你传递的第三个参数(一个函数)是可选的callback参数,显然,因为它正在工作,所以你正确地使用它。

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