Javascript WebSocket can';在事件处理程序方法中看不到Typescript类属性
形势 我有以下类型脚本文件: PlayerList.ts GameEngineInterface.ts GameEngine.ts 索引 当浏览器连接到此websocket服务器时,将引发此错误 var player=this.playerList.addPlayer(套接字); TypeError:无法读取未定义的属性“addPlayer” 如果我将index.ts中的最后一行更改为Javascript WebSocket can';在事件处理程序方法中看不到Typescript类属性,javascript,typescript,websocket,Javascript,Typescript,Websocket,形势 我有以下类型脚本文件: PlayerList.ts GameEngineInterface.ts GameEngine.ts 索引 当浏览器连接到此websocket服务器时,将引发此错误 var player=this.playerList.addPlayer(套接字); TypeError:无法读取未定义的属性“addPlayer” 如果我将index.ts中的最后一行更改为 websocketApp.on(“连接”(socket:socket)=>gameEngine.onNewPl
websocketApp.on(“连接”(socket:socket)=>gameEngine.onNewPlayerConnect(socket))代码>
然后错误消失了
问题
我的代码首先出了什么问题
为什么修复有效
谢谢您抽出时间。因为当您通过函数时
websocketApp.on(“连接”,gameEngine.onNewPlayerConnect)代码>
onNewPlayerConnect
绑定到websocketApp的方式,因此此
上下文指向它
在arrow函数中,绑定onNewPlayerConnect
被保留此
在事件处理程序函数中通常绑定到事件源。当您使用点表示法调用函数(而不是事件队列直接调用它)时,您将不同的this
绑定到函数。谢谢@Teemu。我不知道事件处理程序是这样工作的。我认为使用箭头函数看起来不整洁。你有没有建议如何直接在GameEngine.ts文件中进行绑定,这样我就不必在index.ts中使用arrow函数了?这个arrow函数现在还可以。您还可以使用bind
将this
绑定到对象。
interface GameEngineInterface {
onNewPlayer(socket: Socket):void
}
class GameEngine implements GameEngineInterface {
constructor(private playerList: PlayerList = new PlayerList()){}
onNewPlayer(socket: Socket) {
playerList.addPlayer(socket)
}
}
const gameEngine: GameEngineInterface = new GameEngine();
const httpServer = new Http.Server({}).listen(3000);
const websocketApp = new SocketIO(httpServer);
websocketApp.on("connection", gameEngine.onNewPlayerConnect);