Javascript 在套接字消息(socket.io/node.js)上调用函数
当我启动GameServer的一个新实例时,它会设置套接字和侦听器,如下所示Javascript 在套接字消息(socket.io/node.js)上调用函数,javascript,node.js,closures,socket.io,Javascript,Node.js,Closures,Socket.io,当我启动GameServer的一个新实例时,它会设置套接字和侦听器,如下所示 var GameServer = function() { this.player = new Player(); var that = this; // Setup sockets and listeners var socket = io.listen(8000); socket.sockets.on('connection', function(client) {
var GameServer = function() {
this.player = new Player();
var that = this;
// Setup sockets and listeners
var socket = io.listen(8000);
socket.sockets.on('connection', function(client) {
client.on('message', that.onSocketMessage);
client.on('disconnect', that.onSocketDisconnect);
});
}
然后我有两个原型GameServer.prototype.onSocketMessage和onSocketDisconnect
我对当前代码有两个问题:
var socket = io.listen(8000);
socket.sockets.on('connection', function(client) {
client.on('message', function (data) {
that.onSocketMessage(this, that, data);
});
client.on('disconnect', function() {
that.onSocketDisconnect(this, that);
});
});
可以改进吗?两件事可能会有所帮助。第一件事: 您可以使用修改函数的
视图
注意函数末尾对bind(this)
的调用;这指示JavaScript为您创建一个闭包,使函数外部的this
成为函数内部的this
。(如果您想在函数内部创建this
,比如说,MySomething
,您可以很容易地调用bind(MySomething)
,尽管bind(this)
是最常用的用法)
第二件事:
您可以将数据存储在Socket.IO套接字中。例如,如果一个套接字总是与一个播放器关联,那么您可以这样做
socket.set('player', player, function() {
// callback is called when variable is successfully stored
console.log('player has been stored');
});
// and later
socket.get('player', function(err, player) {
// callback is called either with an error set or the value you requested
player.move();
});
get
和set
方法进行回调,因为Socket.IO数据存储可以设置为内存存储以外的内容;例如,Redis。有两件事可能会有所帮助。第一件事:
您可以使用修改函数的视图
注意函数末尾对bind(this)
的调用;这指示JavaScript为您创建一个闭包,使函数外部的this
成为函数内部的this
。(如果您想在函数内部创建this
,比如说,MySomething
,您可以很容易地调用bind(MySomething)
,尽管bind(this)
是最常用的用法)
第二件事:
您可以将数据存储在Socket.IO套接字中。例如,如果一个套接字总是与一个播放器关联,那么您可以这样做
socket.set('player', player, function() {
// callback is called when variable is successfully stored
console.log('player has been stored');
});
// and later
socket.get('player', function(err, player) {
// callback is called either with an error set or the value you requested
player.move();
});
get
和set
方法进行回调,因为Socket.IO数据存储可以设置为内存存储以外的内容;例如,Redis。绑定选项可以完美地工作。有趣的是,我已经试过bind了,但是我没有正确地实现它,它也不起作用。现在我明白为什么了!问题是:'client.on('message',this.onSocketMessage.bind(this));'当收到该消息时,通常在onSocketMessage中,您会将此.id(即客户端/套接字id)和(数据)传递到函数中。数据仍在传递,但我不再具有对此.id的任何访问权限。我怎样才能让它也通过呢?你不能;这就是为什么bind
只对第一期有用的原因。对于第二个问题,我将以其他方式将player
引入方法中。绑定选项非常有效。有趣的是,我已经试过bind了,但是我没有正确地实现它,它也不起作用。现在我明白为什么了!问题是:'client.on('message',this.onSocketMessage.bind(this));'当收到该消息时,通常在onSocketMessage中,您会将此.id(即客户端/套接字id)和(数据)传递到函数中。数据仍在传递,但我不再具有对此.id的任何访问权限。我怎样才能让它也通过呢?你不能;这就是为什么bind
只对第一期有用的原因。对于您的第二个问题,我将以其他方式将播放器
引入方法。
socket.set('player', player, function() {
// callback is called when variable is successfully stored
console.log('player has been stored');
});
// and later
socket.get('player', function(err, player) {
// callback is called either with an error set or the value you requested
player.move();
});