根据数据将一个主题拆分为不同的主题

时间:2016-07-26 08:58:53

标签: angular rxjs observer-pattern

我有一个使用其他服务连接到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;
        }
      });
  }

}

但是公共变量不会被定义并导致错误,因为使用它们的组件无法订阅它们。

1 个答案:

答案 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);
        }
      });