开发者问题收集

分配 websocket 消息数据时无法读取未定义的属性

2020-08-07
1548

我正在使用 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);
  }

}

任何帮助都非常感谢 :)

1个回答

当您在另一个函数 (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

F.Igor
2020-08-07