2016-07-26 39 views
1

我有一个APIService使用其他服务连接到websocket。 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,我可以使用?如果我写一些代码须藤这也应该是这样的:

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

您应该能够初始化空的对象,并得到其他组件订阅这样的主题:

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

非常感谢!它的工作,onNext方法不适合我。但接下来的方法工作,可能是同样的权利? – trevligheten

+0

是的。我使用Javascript实现编写代码片段,可能Typescript有点不同。它为你工作的主要观点。 –