2017-04-11 1 views
1

Ich lerne Reactive Programming mit RxJs und brauche Hilfe, um den besten Betreiber für diese Situation zu finden. Im Entwicklung einer angular 4 App und haben diese Methode:Wie stelle ich sicher, dass duplizierte Objekte in Array nicht concat werden?

ngAfterViewInit() { 
    this.returnUsers(); 
    } 

    returnUsers() : void { 
    this.userService.ListUsers(this.token) 
     .subscribe(response => { 
      this.token = response.token; 
      this.users = this.users.concat(response.users); 
     }); 
    } 

    scrollDown() { 
    this.returnUsers(); 
    } 

Die Funktionalität ist in Ordnung, das Problem ist, dass, wenn der Benutzer blättern zu schnell, das Token, die ich an den Server senden die gleiche ist, so dass ich Concat dupliziert Objekte. Ich würde gerne wissen, wie es am besten ist, damit umzugehen. Ich versuchte mit .filter Operator, zu concat gerade die nicht wiederholten Gegenstände, aber ich trage noch den Bediener.

Edit: Im mit dem angular2-infinite-scroll

+0

haben Sie distinctUntilChanged versucht? – ABOS

+0

Ich habe es jetzt versucht, dann habe ich die Drosselzeit (in der Vorlage der Scroll-Komponente, die ich verwende) auf 10ms geändert, und immer noch mehrere wiederholte Anfragen an den Server. – gog

Antwort

1

Sind Sie auf jedem Scroll-Ereignis die scrollDown() Methode aufrufen?

Wenn ja, dann machen Sie ein neues Abonnement für jedes Scroll-Ereignis, das ist wahrscheinlich nicht das, was Sie wollen.
Ich denke, Sie müssen Subject Instanz verwenden und einen Wert auf jedem Bildlaufereignis schieben. Dann können Sie debounceTime(100) verwenden, um Emissionen zu verwerfen, die zu schnell ankommen und auch ein einzelnes Abonnement haben.

So etwas (offensichtlich habe ich diesen Code nicht getestet, aber ich hoffe, Sie werden den Punkt verstehen).

+0

es hat martin funktioniert, danke. Ich habe einfach nicht verstanden, warum ich 'this_subject $ .next();' im Konstruktor nach der Subscribe-Zeile setzen muss, um die ersten Ergebnisse zu erhalten. Sollte der Aufruf der subscribe-Methode für den Konstruktor das schon tun? – gog

+0

@ggui 'this_subject $ .next();' befindet sich innerhalb der Methode 'scrollDown()', nicht im Konstruktor – martin

Verwandte Themen