根据数据将一个 Subject 拆分成不同的 Subject

Split one Subject into different Subjects depending on the data

我有一个 APIService,它使用另一个服务连接到 websocket。 websocket 服务 returns 类型 Subject<MessageEvent> 的套接字。然后在我的 APIService 中,我想根据有效负载将这个 Subject 吐到不同的 Subjects 中。我的 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;
        }
      });
  }

}

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

您应该能够像这样初始化空主题并让其他组件订阅主题:

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