我只是想确认一下对我的怀疑。
我偶然发现了一篇文章,推荐按以下方式使用Socket.io:
var app = require('express').createServer()
var io = require('socket.io').listen(app);
app.listen(8080);
// Some unrelated stuff
io.sockets.on('connection', function (socket) {
socket.on('action1', function (data) {
// logic for action1
});
socket.on('action2', function (data) {
// logic for action2
});
socket.on('disconnect', function(){
// logic for disconnect
});
});
我觉得以下是更好的资源利用方式:
var app = require('express').createServer()
var io = require('socket.io').listen(app);
app.listen(8080);
// Some unrelated stuff
io.sockets.on('connection', function (socket) {
socket.on('action1', action1);
socket.on('action2', action2);
socket.on('disconnect', disconnect);
});
function action1(data) {
// logic for action1
}
function action2(data) {
// logic for action2
}
function disconnect() {
// logic for disconnect
}
我的感觉是,尽管处理connection
事件的匿名函数只在内存中创建一次,但处理action1
、action2
和disconnect
的匿名函数是为每个套接字连接在内存中创建的。第二种方法的问题是socket
不再在范围内。
那么,首先,我对创建函数的怀疑是真的吗?其次,如果是这样的话,是否有一种方法可以将socket
放在命名函数的作用域中?
发布于 2012-04-15 04:38:29
使用闭包有助于保持作用域的整洁:
io.sockets.on('connection', function () {
function action1(data) {
// logic for action1
}
function action2(data) {
// logic for action2
}
function disconnect() {
// logic for disconnect
}
return function (socket) {
socket.on('action1', action1);
socket.on('action2', action2);
socket.on('disconnect', disconnect);
}
}()); // <- note the immediate function call
回答您的问题:
那么,首先,我对函数创建的怀疑是真的吗?
是。上面的闭包方法避免了这种情况,回调函数只创建一次。另外:所有都可以看到正确的父作用域。
,其次,如果是这样的话,有没有一种方法可以将
socket
放在命名函数的作用域中?
socket
将在回调中以this
的形式提供。
发布于 2012-04-15 04:30:05
您说得对,匿名方法是为每个连接创建的-如果您不需要作用域,那么第二个方法就可以避免这种情况。如果您需要套接字作用域,没有真正的方法可以避免它。如果您希望将方法保留在外部(出于某些其他原因),并且仍然保留作用域,则始终可以:
//...
socket.on('action1', function(){
action1.apply( socket, arguments );
} );
//... and so forth.
但是这会让你重新为每个连接创建一个方法签名,所以我不确定你会得到什么。
https://stackoverflow.com/questions/10157063
复制相似问题