在套接字消息(socket.io/node.js)上调用函数
当我启动一个新的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) { client.on('message', that.onSocketMessage); client.on('disconnect', that.onSocketDisconnect); }); }
然后我有两个原型GameServer.prototype.onSocketMessage&onSocketDisconnect。
我现在的代码有两个问题:
-
用这个=这个和闭包? function。 看起来很丑。
-
当onSocketMessage被调用时,这个想法是什么消息,然后调用GameServer中的另一个函数。 只有这是不可能的,因为这属于socket.io系统。 见下文:
…
function onSocketMessage() { this.player.move(); }
this.player不再可用。 不再是GameServer的一部分。
我的套接字设置和消息传递是否应该在GameServer函数和原型之外进行处理?
或者我可以怎样解决这个问题?
干杯
编辑
好,所以我已经试过这个,它的工作,但看起来很丑陋我想:
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
方法修改函数的视觉效果。
socket.sockets.on('connection', function(client) { client.on('message', this.onSocketMessage); client.on('disconnect', this.onSocketDisconnect); }.bind(this));
注意在函数结束时bind(this)
的调用; 这指示JavaScript为你创build一个闭包,使this
函数之外的东西成为this
东西。 (如果你想在这个函数里面,比如说MySomething
,你可以简单地调用bind(MySomething)
,尽pipebind(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
方法使用callback函数,因为可以将Socket.IO数据存储设置为除内存存储以外的内容。 例如,Redis。