私の角張ったアプリケーションは、WebSocketを使ってバックエンドと通信します。WebSocketで観測可能なRxJ
私のテストケースでは、2つのクライアントコンポーネントがあります。 Observableタイマーは、期待どおりに2つの異なるクライアントIDを出力します。
各ngOnInit()は、クライアントのIDも表示します。
何らかの理由で、websocketService.observeClient()のサブスクリプションがメッセージごとに2回呼び出されましたが、this.client.id
は常に2番目のクライアントの値を出力します。
HERESに私のクライアントコンポーネント
@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;
}
}
編集[OK]を私の知る限り、それはその観測事実に関係しています読んだことがあるよう
ユニキャストオブジェクトであり、そのためにSubjectを使用する必要がありますが、Subjectを作成する方法はわかりません。
あなたは問題があなたの 'providers'の設定がされていませんか?あなたの説明から、各クライアントコンポーネントに 'WebsocketService'の独自のインスタンスが必要なように見えます。 – martin
いいえバックエンドに接続された1つの注入されたwebsocketServiceが必要です – Pascal