RxJs Observables avec WebSocket

Mon angulaire application utilise un websocket pour communiquer avec le backend.

Dans mon cas de test, j'ai 2 composants du client. Les Observables de la minuterie imprime deux clients différents id comme prévu.

Chaque ngOnInit() imprime également l'id de son client.

MAINTENANT pour une raison quelconque, l'abonnement de websocketService.observeClient() est appelé 2 fois pour chaque message, mais this.client.id toujours imprime la valeur de la deuxième client.

Heres mon composant client

@Component({
...
})
export class ClientComponent implements OnInit {

  @Input() client: Client;

  constructor(public websocketService: WebsocketService) {
    Observable.timer(1000, 1000).subscribe(() => console.log(this.client.id));
  }

  ngOnInit() {

    console.log(this.client.id);
    this.websocketService.observeClient().subscribe(data => {
      console.log('message', this.client.id);
    });

  }

}

Et mon websocket Service

@Injectable()
export class WebsocketService {

  private observable: Observable<MessageEvent>;
  private observer: Subject<Message>;

  constructor() {

    const socket = new WebSocket('ws://localhost:9091');

    this.observable = Observable.create(
      (observer: Observer<MessageEvent>) => {
        socket.onmessage = observer.next.bind(observer);
        socket.onerror = observer.error.bind(observer);
        socket.onclose = observer.complete.bind(observer);
        return socket.close.bind(socket);
      }
    );

    this.observer = Subject.create({
      next: (data: Message) => {
        if (socket.readyState === WebSocket.OPEN) {
          socket.send(JSON.stringify(data));
        }
      }
    });

  }

  observeClient(): Observable<MessageEvent> {
    return this.observable;
  }

}

Modifier

Ok comme ce que j'ai lu, il a à voir avec le fait que les phénomènes Observables sont unicast objets et je dois utiliser un Sujet pour ça, mais je ne sais pas comment créer le Sujet.

Êtes-vous sûr que le problème n'est pas dans votre providers de configuration? À partir de votre description, il semble que vous voulez que chaque composant client pour avoir sa propre instance de WebsocketService.
Pas de il devrait être injecté websocketService qui est connecté à l'arrière-plan

OriginalL'auteur Pascal | 2017-04-10