在套接字消息(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。

我现在的代码有两个问题:

  1. 用这个=这个和闭包? function。 看起来很丑。

  2. 当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(); }); 

getset方法使用callback函数,因为可以将Socket.IO数据存储设置为除内存存储以外的内容。 例如,Redis。