典型socket.io应用程序的服务器端如下所示:
io.on("connection", function(socket){
socket.on("foo", function(data) {
});
socket.on("bar", function(data) {
});
[ ... ]
socket.on("disconnect", function() {
});
});
这是不是意味着对于每个新连接,每个套接字单独完成foo
,bar
等的绑定?如果有1000个连接,那么不会有1000个相同foo
回调函数的实例吗?
如果是这样,既然Node会保留1000个匿名但相同的功能,那会不会浪费大量内存?
答案 0 :(得分:3)
我在谷歌搜索时遇到了你的问题,因为我有同样的担忧。我想通了,但我知道这有点老了,如果它对你没有帮助,希望它能帮助其他人想知道同样的事情。
Socket.io的Socket
类继承自节点的EventEmitter
(正如您从source code所见)
正如this article解释和演示的那样,EventEmitter将在EventEmitter
实例(在本例中为套接字)的上下文中运行您的回调。
因此,为了更好地实现原始代码(我看到无处不在演示socket.io):
io.on( 'connection', function( socket ) {
socket.on( 'foo', onFoo );
socket.on( 'bar', onBar );
socket.on( 'echo', onEcho );
// ...
socket.on( 'disconnect', onDisconnect );
});
function onFoo(data) {
/* `this` refers to the socket */
}
function onBar(data) {
/* `this` refers to the socket */
}
function onEcho(data) {
/* `this` refers to the socket */
this.emit('echo-back', data);
}
// ...
function onDisconnect() {
/* `this` refers to the socket */
}