2016-12-05 5 views
1

Ich habe obeservables dieser Objekte:Angular 2 Rxjs: Tragen Sie verschiedene auf Objekte

{ 
     id : "f3055770-6e66-4936-8e9a-732b53121549" 
     message:"Empty Notification for test ......" 
     navigationLink:"/fusion/home" 
     seen:false 
     sendedOn:"2016-12-02T15:19:44.856Z" 
     userId :null 
     } 

Ich mag nicht duplizierten Objekt erhalten (basierend auf ids) und ich diese Methode verwenden, um es zu erreichen

notify(userID: string) { 
    return Observable.interval(5000) 
     .map(() => this.baseUrl + '/notification/GetUnseen?userId=' + userID) 
     .switchMap(url => { 
      return Observable.from(this.datatService.get(url)); 
     }) 
     .flatMap(response => Observable.from(response.json().slice())) 

} 

Wenn ich distinct (x => x.id) als letzten Operator hinzufügen, habe ich nur ein Objekt anstelle von Four irgendeine Hilfe?

UPDATE:

Ich nenne diese Methode in der oninit() Lebenszyklus meiner Komponente, so dass das Verfahren alle 5 Sekunden ausführen Benachrichtigung zu erhalten, verwende ich distict auf diese Weise:

notify(userID: string) { 
    return Observable.interval(5000) 
     .map(() => this.baseUrl + '/notification/GetUnseen?userId=' + userID) 
     .switchMap(url => { 
      return Observable.from(this.datatService.get(url)); 
     }) 
     .flatMap(response => Observable.from(response.json().slice())) 
     .distinct(x => x.id); 
} 

UPDATE 2

Serveur Rohantwort:

"[{"userId":null,"sendedOn":"2016-12-02T15:19:44.856Z","message":"Empty Notification for test ......","navigationLink":"/fusion/home","seen":false,"id":"f3055770-6e66-4936-8e9a-732b53121549"},{"userId":null,"sendedOn":"2016-12-02T15:19:45.146Z","message":"Empty Notification for test ......","navigationLink":"/fusion/home","seen":false,"id":"ce172122-11d9-4054-a3e4-594c8c910a7d"},{"userId":null,"sendedOn":"2016-12-02T15:19:45.146Z","message":"Empty Notification for test ......","navigationLink":"/fusion/home","seen":false,"id":"66e32c45-f544-4ce6-901c-e5ac64904954"},{"userId":null,"sendedOn":"2016-12-02T15:19:45.147Z","message":"Empty Notification for test ......","navigationLink":"/fusion/home","seen":false,"id":"4c2322cb-526c-490e-8a86-f1e9ced1c34f"}]" 
+0

Können Sie bitte den Kontext angeben: 1) Wie nennen Sie diese Methode? 2) Wo fügen Sie den "distinct" Operator hinzu? – Meir

+0

Sind Sie sicher, dass diese vier Objekte nicht die gleiche ID haben? – martin

+0

Aktualisiert, @martin yeah bin sicher, dass die IDs nicht die gleichen sind –

Antwort

1

Ich fand die Lösung für die distinct!

In der Tat ging die Funktion disctinct 2 Parameter übernehmen können (precedentValue, actual), so können Sie dieses Problem wie folgt beheben:

.... 
.... 
.distinct(function (x, y) { return x.id === y.id; }); 

Es hat eine boolean bei jeder Iteration zurückkehren (ist x.id = y.id? => wahr oder falsch ...).

** UPDATE **

Mein Fehler ist, dass ich für die rxjs 4.0-Dokumentation war auf der Suche, und mein Projekt ist auf rxjs 5.

Verwandte Themen