分配 websocket 消息数据时无法读取未定义的属性
我正在使用 Ratchet Websocket 创建一个聊天应用程序。我按照他们的 Hello World 教程进行操作: http://socketo.me/docs/hello-world
当我尝试通过全局函数或变量分配收到的消息的数据时,我收到错误:
“ERROR TypeError:无法读取未定义的属性‘recievedMessage’ at onMessage_callback (dashboard.component.ts:32) at WebSocket.conn.onmessage [as __zone_symbol__ON_PROPERTYmessage]”
我读过许多其他有同样问题的发帖人,但我不知道如何让他们的答案像他们说的那样工作。我正在尝试将发送和接收的消息添加到全局数组中,以便我可以将它们全部显示在聊天列表中。我知道我的问题与
this.conn.onmessage=function(e)
的范围有关,但这是我第一次使用 websockets 或看到这种语法。
为什么我不能从
function onMessage_callback(data);
调用
this.recievedMessage(data);
?
类似问题(它甚至提到你可以将回调中的数据分配给全局变量,但这对我不起作用): WebSocket 在代码中返回未定义,但在控制台中未返回
我知道我的所有后端客户端/聊天 php 都正常工作,因为控制台显示了不同连接的消息。
typescript 代码:
export class DashboardComponent implements OnInit {
conn:WebSocket;
messageDisplay:any[] = ["Welcome To Chat"]
message: string;
constructor() {}
ngOnInit(): void {
this.conn = new WebSocket('ws://localhost:8080');
this.conn.onopen = function(e) {
console.log("Connection established!");
};
this.conn.onmessage = function(e) {
console.log(e.data);
onMessage_callback(e.data);
};
function onMessage_callback(data){
this.recievedMessage(data);
}
}
recievedMessage(message){
this.messageDisplay.push(message);
}
sendMessage(message){
this.conn.send(message);
this.messageDisplay.push(message);
console.log(this.messageDisplay);
}
}
任何帮助都非常感谢 :)
当您在另一个函数 (onMessage_callback) 内部时,
this
的上下文会发生变化,因此此时
this
不再引用父对象。
要使用对主类的引用
this
,您必须将此引用包装在另一个局部变量中(在此示例中为
self
)
ngOnInit(): void {
var self = this;
this.conn = new WebSocket('ws://localhost:8080');
this.conn.onopen = function(e) {
console.log("Connection established!");
};
this.conn.onmessage = function(e) {
console.log(e.data);
onMessage_callback(e.data);
};
function onMessage_callback(data){
self.recievedMessage(data);
}
}
本文以
binding
函数的示例进行说明
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Function/bind