RxJs observáveis com WebSocket
Meu aplicativo angular usa um soquete da web para se comunicar com o back-end.
No meu caso de teste, tenho 2 componentes de cliente. O timer Observable imprime dois IDs de cliente diferentes conforme o esperado.
Cada ngOnInit () também imprime o ID do seu cliente.
AGORA, por algum motivo, a assinatura do websocketService.observeClient () é chamada duas vezes para cada mensagem, masthis.client.id
sempre imprime o valor do segundo cliente.
Heres meu componente cliente
@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);
});
}
}
E o meu serviço websocket
@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;
}
}
Editar
Ok, até onde eu li, tem a ver com o fato de que os Observables são objetos unicast e eu tenho que usar um Assunto para isso, mas não sei como criar o Assunto.