Javascript 收到websocket消息时ES6类中未定义的方法
当websocket事件触发时,我收到以下消息。无法访问外部上下文对象 未捕获的TypeError:无法读取未定义的属性“wsHandler” 在WebSocket.onmessage_收到(clsWebSocketSender.js:42)Javascript 收到websocket消息时ES6类中未定义的方法,javascript,websocket,ecmascript-6,Javascript,Websocket,Ecmascript 6,当websocket事件触发时,我收到以下消息。无法访问外部上下文对象 未捕获的TypeError:无法读取未定义的属性“wsHandler” 在WebSocket.onmessage_收到(clsWebSocketSender.js:42) 您试图通过构造函数的本地变量\u self访问它: var\u self=this 请尝试直接在上访问它,改为: this.wsHandler.onMessageReceived(jsonData) 如果您随后发现此未定义或其他问题(我希望您会),只需将事
您试图通过构造函数的本地变量
\u self
访问它:
var\u self=this代码>
请尝试直接在上访问它,改为:
this.wsHandler.onMessageReceived(jsonData)
如果您随后发现此未定义或其他问题(我希望您会),只需将事件侦听器更改为使用箭头函数,这将保留您的此
this.ws.addEventListener('message',(message)=>this.onmessage_received(message))代码>
类WebSocketSender{
构造函数(wsHandler){
this.wsHandler=wsHandler;
this.ws==null;
this.url='';
}
初始化(url、发件人){
this.url=url;
this.ws=新的WebSocket(url);
this.ws.onopen=()=>console.log(“打开”);
this.ws.onclose=()=>console.log(“关闭”);
this.ws.onerror=()=>console.log(“错误”);
this.ws.addEventListener('message',message=>this.onmessage_received(message));
}
发送(数据){
if(this.ws.readyState==1){
this.ws.send(数据);
}
}
收到的信息(e){
调试器;
var server_message=e.data;
让jsonData=JSON.parse(e.data);
this.wsHandler.onMessageReceived(jsonData)
}
关闭(){
if(this.ws.readyState==1){
this.ws.close();
}
}
}
在构造函数中更改
this._self.wsHandler.onMessageReceived(jsonData)
到
_self变量将仅存在于构造函数中,在其他函数中不可用将arrow函数用于回调:将onmessage_received方法更改为:
onmessage_recieved = (e) => {
debugger;
var server_message = e.data;
let jsonData = JSON.parse(e.data);
this.wsHandler.onMessageReceived(jsonData)
}
尝试了同样的错误Uncaught TypeError:无法读取WebSocket.onmessage_received(clsWebSocketSender.js:42)上未定义的属性“onMessageReceived”,那么您确定wsHandler
正在按预期传递到构造函数中吗?是,已初始化它。我认为从websocket触发事件时作用域是不同的。使用arrow函数应该可以解决这个问题:this.ws.addEventListener('message',(message)=>this.onmessage_received(message))代码>我认为这将按照此链接中的定义工作。但是如何在es6类中实现呢
this.wsHandler.onMessageReceived(jsonData)
onmessage_recieved = (e) => {
debugger;
var server_message = e.data;
let jsonData = JSON.parse(e.data);
this.wsHandler.onMessageReceived(jsonData)
}