Данные Websocket доступны в моем угловом сервисе, но не в подписке - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь отправить некоторые данные из моего go_backend на мой угловой интерфейс.Проблема, с которой я сталкиваюсь, заключается в следующем:

Соединение с веб-сокетом установлено, и я получаю данные в моем Сервисе, но как только я пытаюсь подписаться на мою услугу, никакие данные не доступны!

Я знаю, что у меня есть данные в моем сервисе, так как я могу регистрировать их там.

Код моего сервиса выглядит так:

import { Injectable, EventEmitter } from '@angular/core';
import {environment} from '../../environments/environment';

@Injectable({
  providedIn: 'root'
})
export class WebsocketService {
  private socket: WebSocket;
  private listener: EventEmitter<any> = new EventEmitter();

  constructor() {
    this.socket = new WebSocket(`${environment.wsUrl}/canLoop`);
    this.socket.onopen = (event) => {
      console.log('socket.info: ', this.socket.OPEN);
      this.listener.emit({'type': 'open', 'data': event});
    };
    this.socket.onclose = (event) => {
      console.log(event);
      this.listener.emit({'type': 'close', 'data': event});
    };
    this.socket.onmessage = (event) => {
      console.log(event);
      this.listener.emit({'type': ' message', 'data': event});
    };
  }
  public close() {
    this.socket.close();
  }

  public getEventListener() {
    return this.listener;
  }

}

И подписан в моем Компоненте так:

import { Component, OnInit, OnDestroy } from '@angular/core';
import { CanRawService } from 'src/app/services/can-raw.service';
import { WebsocketService } from 'src/app/services/websocket.service';

@Component({
  selector: 'app-message-loop',
  templateUrl: './message-loop.component.html',
  styleUrls: ['./message-loop.component.scss']
})
export class MessageLoopComponent implements OnInit {

  public canMsgs: Array<any>;

  constructor(private rawSrv: CanRawService, private sockSrv: WebsocketService) {
    this.canMsgs = [];
  }

  ngOnInit() {
    this.sockSrv.getEventListener().subscribe(event => {
      if (event.type === 'message') {
        // tslint:disable-next-line:prefer-const
        let data = JSON.parse(event.data);
        this.canMsgs.push(data);
        console.log('lelele', event.data);
      }
      if (event.type === 'close') {
        console.log('/The socket connection has been closed');
      }
      if (event.type === 'open') {
        console.log('/The socket connection has been established');
      }

    });
  }
  // tslint:disable-next-line:use-life-cycle-interface
  ngOnDestroy() {
    this.sockSrv.close();
  }
}

Я могу видеть данные, когда регистрирую их в службе, но не могу получить к ним доступ, когда подписываюсь на них

Любые советы приветствуются!

ура

1 Ответ

0 голосов
/ 06 февраля 2019

Отправляет ли ваш веб-сокет данные, как только вы к нему подключаетесь?

Если это так, возможно, события генерируются до того, как ваш компонент подписался на сокет в вашем сервисе.

То есть:

|
| - service is created (and also the socket in constructor)
| - onopen is emitted
| - message is emitted
| - component is created
| - component is ready -> run ngOnInit() and subscribe to events
| - component is subscribed, but all events have already been emitted

Я полагаю, вы могли бы проверить это, вставив console.log в ngOnInit(), чтобы посмотреть, генерируются ли события до запуска метода.

Я бы попытался отложить соединение с веб-сокетом.Попробуйте вставить код конструктора в WebsocketService.getEventListener()

. Если вы используете rxjs, это может помочь: https://rxjs -dev.firebaseapp.com / api / webSocket / webSocket

...