2016-07-26 4 views
1

Ich habe einen APIService, der eine Verbindung zu einem Websocket mit einem anderen Dienst herstellt. Der Websocket-Dienst gibt einen Socket vom Typzurück. Dann möchte ich in meinem APIService dieses Thema abhängig von der Nutzlast in verschiedene Themen spucken. Mein APIService sieht wie folgt aus:Teilen Sie einen Betreff in verschiedene Themen in Abhängigkeit von den Daten

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

} 

Gibt es einen anderen Betreiber statt map, die ich verwenden kann? Wenn ich etwas sudo-Code für diese schreiben würde es so aussehen:

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

} 

Aber dann wird nicht die öffentlichen Variablen definiert werden und einen Fehler, da meine Komponenten mit ihnen verursachen können sie nicht abonnieren.

Antwort

1

Sie sollten in der Lage sein, leere Fächer zu initialisieren und andere Komponenten zu den Themen wie diese abonnieren erhalten:

sonos = new Rx.Subject() 
commits = new Rx.Subject(); 

Als nächstes, wenn Sie die Daten zurückkommen, können Sie so etwas wie diese

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

Vielen Dank! Es hat funktioniert, die onNext-Methode hat bei mir nicht funktioniert. Aber die Methode funktioniert, funktioniert wahrscheinlich genauso? – trevligheten

+0

Ja. Ich habe das Code-Snippet mit Javascript-Implementierung geschrieben, wahrscheinlich ist Typescript ein bisschen anders. Der Hauptpunkt, für den es für dich gearbeitet hat. –

Verwandte Themen