Javascript 在套接字消息(socket.io/node.js)上调用函数

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) {

当我启动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

我对当前代码有两个问题:

  • 使用它=这个和闭包?作用看起来很丑

  • 当调用onSocketMessage时,其思想是它计算出消息的内容,然后调用GameServer中的另一个函数。只是这是不可能的,因为现在它属于socket.io系统。见下文:

  • 此.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(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();
    });