2016-07-26 42 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有點不同。它爲你工作的主要觀點。 –