Angular ПоведениеСубъект пуст - PullRequest
0 голосов
/ 24 марта 2020

Я попытался создать веб-сокет-клиент, который помещает все сообщения с сервера в объект BehaviorSubject. Это код:

export class WebSocketConnectionService {

  public ResponseList: BehaviorSubject<WebSocketResponse> = new BehaviorSubject(null);

  private socket: any;

  private webAuth: Auth;

  private pingInterval: any;

  constructor(private authService: AuthService) {
    this.authService.UserToken.subscribe(myToken => {
      const myUUID = this.authService.getUUID();
      this.webAuth = {token: myToken, uuid: myUUID};
      console.log('Auth: ', this.webAuth);
    });
    this.ResponseList.subscribe(response => {
      console.log('New Response in List: ', response);
    })

    this.socket = new WebSocket(environment.socket_url);
    this.socket.onmessage = this.onMessage;
    console.log('Socket: ', this.socket);

   }


   private onMessage(message: MessageEvent) {
     const body: WebSocketResponse = JSON.parse(message.data);
     console.log('Message: ', message);
     console.log('data: ', body);
     console.log('list: ', this.ResponseList);
     this.ResponseList.next(body);
   }

  public sendConnection(user: UserItem): Promise<any> {
    return new Promise((resolve, reject) => {

      try {
        this.sendInternalCommand('link_user', user);
        resolve();
      } catch(e) {
        console.error(e);
        reject();
      }
    })
  }


  private sendInternalCommand(command: string, data: any) {
    const message: WebSocketConnectionItem = {
      version: 1,
      event: command,
      auth: this.webAuth,
      body: data
    };
    const string_message = JSON.stringify(message);
    console.log('Send: ', string_message);
    this.socket.send(string_message);
  }
}

Я мог бы отправить открытый ConnectionItem. Ошибка возникает в onMessage, в этом блоке объект ResponseList имеет значение null.

Что не так?

Ищем вашу помощь.

1 Ответ

1 голос
/ 24 марта 2020

Я считаю, что проблема в этой строке:

this.socket.onmessage = this.onMessage;

Сокет вызывает функцию onmessage в контексте самого себя, поэтому ' this ' является экземпляром WebSocket , Вы можете попробовать привязать метод onMessage к экземпляру класса WebSocketConnectionService:

this.socket.onmessage = this.onMessage.bind(this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...