【问题标题】:Split one Subject into different Subjects depending on the data根据数据将一个主题拆分为不同的主题
【发布时间】:2016-07-26 19:12:26
【问题描述】:

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

}

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

【问题讨论】:

    标签: angular rxjs observer-pattern


    【解决方案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);
            }
          });
    

    【讨论】:

    • 非常感谢!它有效,onNext 方法对我不起作用。但是接下来的方法奏效了,大概也一样吧?
    • 是的。我用 Javascript 实现写了代码 sn-p,可能 Typescript 有点不同。它对你有用的要点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2019-10-09
    • 2020-01-01
    • 2018-06-14
    • 1970-01-01
    • 2020-04-21
    相关资源
    最近更新 更多