我有一个使用其他服务连接到websocket的APIService。 websocket服务返回类型为Subject<MessageEvent>
的套接字。然后在我的APIService中,我想根据有效负载将此主题吐入不同的主题。我的APIService看起来像这样:
export class APIService {
public sonos: Subject<sonosData>;
public commits: Subject<commitData>;
constructor(wsService: WebsocketService) {
this.sonos = <Subject<sonosData>>wsService
.connect(WEBSOCKET_URL)
.map((response: MessageEvent) => {
let data = JSON.parse(response.data);
if(data.sonos) {
return data.sonos;
}
});
}
}
我可以使用另一个运算符而不是map
吗?如果我为此编写一些sudo代码,它将如下所示:
export class APIService {
public sonos: Subject<sonosData>;
public commits: Subject<commitData>;
constructor(wsService: WebsocketService) {
wsService
.connect(WEBSOCKET_URL)
.forEach((response: MessageEvent) => {
let data = JSON.parse(response.data);
if(data.sonos) {
this.sonos = data.sonos;
}
if(data.commits) {
this.commits = data.commits;
}
});
}
}
但是公共变量不会被定义并导致错误,因为使用它们的组件无法订阅它们。
答案 0 :(得分:1)
您应该能够初始化空主题并让其他组件订阅这样的主题:
sonos = new Rx.Subject()
commits = new Rx.Subject();
接下来,当你收回数据时,你可以做这样的事情
wsService
.connect(WEBSOCKET_URL)
.forEach((response: MessageEvent) => {
let data = JSON.parse(response.data);
if(data.sonos) {
this.sonos.onNext(data.sonos);
}
if(data.commits) {
this.commits.onNext(data.commits);
}
});