【问题标题】:How can I get Node.js class and socket.io event context?如何获取 Node.js 类和 socket.io 事件上下文?
【发布时间】:2017-02-24 20:04:24
【问题描述】:

我在 JavaScript 类和 socket.io 'disconnect' 事件中的正确上下文存在问题。

我的班级是这样的:

class GameSession {

   constructor(gameSessionId) {
       this._gameSessionId = gameSessionId;
       this._players = new Map();
   }

   addPlayer(socketId,player) {
       this._players.set(socketId,player);
       this.addListeners(player);
   }

   addListeners(player) {
       player.socket.on('disconnect',this.playerLeave);
   }

   playerLeave () {
       // ##### here is my Problem
   }
}

在“playerLeave”函数中,我可以使用“this.id”访问套接字 id。但是要访问“_players”地图,我需要将“addListeners”函数更改为:

addListeners(player) {
    player.socket.on('disconnect',() => this.playerLeave());
}

但是这样我就失去了事件的上下文,因此可以调用“this.id”来接收套接字 id。

我怎样才能两者兼得?

【问题讨论】:

    标签: javascript node.js class socket.io


    【解决方案1】:

    你可以试试这样的:

    addListeners(player) {
      player.socket.on('disconnect', this.playerLeave.bind(this));
    }
    
    playerLeave (socket) {...}
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我找到了解决方案。 (希望你也找到了!)

      你只需要像这样绑定两个实例:

         addListeners(player) {
             var playerSocket = player.socket;
             playerSocket.on('disconnect',this.playerLeave.bind(playerSocket, this));
         }
      

      并且类实例将作为参数在您的 socketIO 事件中传递:

         playerLeave(gameSessionInstance) {
             console.log('Bye '+this.id);
             gameSessionInstance.removePlayer(this.id); // if you have a method called removePlayer for example
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-27
        • 2016-01-23
        • 1970-01-01
        • 2014-11-19
        相关资源
        最近更新 更多