2016-03-12 5 views
5

Gibt es eine Kombination von RX-Operatoren, um das erste und letzte entprellte Ereignis zu bekommen?Rx Entprellen Operator mit ersten und letzten

Dies wird in Master-Detail-Szenarien (oder sogar in Suchszenarien) verwendet, in denen das erste ausgewählte Element sofort geladen werden soll und das letzte Mal, nachdem der Benutzer die Auswahl ändert.

Dies würde verhindern, dass die Entprellzeit injiziert wird, wenn der Benutzer langsam navigiert, aber auch Bursts von Änderungen verhindern.

Wenn debounce Operator eine Option "sofort" wie underscore.js debounce functoin hätte, dann würde eine Zusammenführung der beiden Versionen des Debounce-Operators das benötigte Ergebnis erzeugen.

Antwort

8

Um das erste entprellte Element zu erhalten, können Sie throttle verwenden. Um die letzte zu erhalten, können Sie debounce verwenden. Sie sollten jedoch sicherstellen, dass die Quelle, die Sie entprellen oder drosseln, eine heiße Quelle ist, da Sie beide Operatoren auf dieselbe Quelle anwenden. Wenn Sie beide Elemente in derselben Observablen haben möchten, können Sie die gedrosselten und entprellten Streams einfach zusammenführen.

Zum Beispiel ruft source$ Ihre Quelle beobachtbar:

firstAndLast$ = Rx.Observable.merge(source$.debounce(Xms), source$.throttle(Xms)) 

Dies sollte das erste Element Ausgabe und das letzte Element eines Bursts in dem gleichen Strom. Beachten Sie, dass im Randfall, dass es sich nicht um einen Burst handelt, sondern um einen einzelnen Wert, der innerhalb der Xms-Zeitperiode auftritt, der Wert zweimal derselbe sein kann, einer zu Beginn der Periode und einer am Ende. Ein Weg, um gegen das zu schützen, wenn das Sinn macht, ist distinctUntilChanged zu verwenden, so wird daraus:

firstAndLast$ = Rx.Observable.merge(source$.debounce(Xms), source$.throttle(Xms)).distinctUntilChanged() 
+0

Ich weiß und danke für die rem Inder, aber das ist die offizielle Dokumentation. Ich werde meine Antwort auf jeden Fall aktualisieren. – user3743222

+0

Ich schätze, dass es sich um offizielle Dokumentation handelt, aber da Stack Overflow die Site nicht kontrolliert, werden die URLs kaputt oder einfach bearbeitet und werden ungültig. Es ist immer am besten, sich nicht auf Seiten Dritter zu verlassen, die unverändert bleiben. – Enigmativity

2

Das Kombinieren von Gas und Entprellung, wie in der vorherigen Antwort vorgeschlagen, war nicht genug für mich, weil es regelmäßig neue Ereignisse ausgibt, wenn die Gaszeit abgelaufen ist.

const debounced$ = source$.debounceTime(time) 
return source$.throttleTime(time) 
    .merge(debounced$).distinctUntilChanged() 

Mit einem time=30 würden Sie erhalten:

-a-a-a-a-a-a---- 
-a---a---a----a- 

nur um das erste und das letzte Ereignis mit einer minimalen Zeit in erhalten zwischen I verwendet:

const debounced$ = source$.debounceTime(time) 
return source$.throttle(() => debounced) 
    .merge(debounced$).distinctUntilChanged() 

was dazu führt:

-a-a-a-a-a-a---- 
-a------------a- 
Verwandte Themen