我的角度應用程序使用websocket與後端進行通信。RxJs使用WebSocket可觀察
在我的測試案例中,我有2個客戶端組件。 Observable timer按預期打印兩個不同的客戶端ID。
每個ngOnInit()還會打印其客戶端的ID。
現在由於某種原因,websocketService.observeClient()的訂閱被稱爲每個消息2次,但this.client.id
總是打印第二個客戶端的值。
我的繼承人客戶端組件
@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);
});
}
}
而且我的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;
}
}
編輯
好,據我已經閱讀它的事實,做觀測量是單播對象,我必須使用主題,但我不知道如何創建主題。
你確定這個問題是不是在你的'providers'配置?從你的描述看來,你希望每個客戶端組件都有自己的'WebsocketService'實例。 – martin
不應該有一個注入websocketService連接到後端 – Pascal