2016-03-12 13 views
5

Czy istnieje jakaś kombinacja operatorów rx, aby uzyskać pierwsze i ostatnie zdekonferencje?Rx przedstawia operatora z pierwszym i ostatnim numerem

Będzie to używane w scenariuszach szczegółów głównych (lub nawet w scenariuszach), w których chcemy natychmiastowo załadować pierwszy wybrany przedmiot, a ostatni użytkownik przestanie zmieniać wybór.

Zapobiegnie to wstrzyknięciu wtyczki, gdy użytkownik będzie nawigował powoli, ale zapobiegnie również serii zmian.

Jeśli operator debounce miał opcję "natychmiastową", jak underscore.js debounce functoin, wówczas połączenie dwóch wersji operatora odbicia wygenerowałoby potrzebny wynik.

Odpowiedz

8

Aby uzyskać pierwszy element odrzucany, można użyć throttle. Aby uzyskać ostatni, możesz użyć debounce. Powinieneś jednak upewnić się, że źródło, z którego się usuwasz lub dławienie jest gorącym źródłem, ponieważ zastosujesz oba operatory do tego samego źródła. Następnie, jeśli chcesz mieć oba elementy w tym samym obserwowalnym, możesz po prostu połączyć strumienie zdławione i wyrzucone.

Na przykład, nazywając source$ źródło zaobserwowania:

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

ten powinien wydać pierwszy element i ostatni element wybuch w tym samym strumieniu. Zauważ, że w przypadku krawędzi, że nie jest to seria, ale pojedyncza wartość występująca w okresie Xms, możesz mieć podwójną wartość, jedną na początku okresu i jedną na końcu. Sposób, aby chronić przed tym, jeśli jest to sensowne jest użycie distinctUntilChanged, więc staje się:

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

Wiem i dziękuję za rem ale jest to oficjalna dokumentacja. W każdym razie zaktualizuję swoją odpowiedź. – user3743222

+0

Rozumiem, że może to być oficjalna dokumentacja, ale ponieważ Stack Overflow nie kontroluje witryny, adresy URL zostają zerwane lub po prostu edytowane i stają się nieważne. Najlepiej nie polegać na niezmienionych witrynach osób trzecich. – Enigmativity

2

Po prostu łączenie przepustnicy i tłumienia drgań, jak sugerowano w poprzedniej odpowiedzi, nie było dla mnie wystarczające, ponieważ okresowo emituje nowe zdarzenia, gdy upłynie czas przepustnicy.

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

Z time=30 dostaniemy:

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

Aby uzyskać tylko pierwszy i ostatni wydarzenie minimalny czas pomiędzy użyłem:

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

co skutkuje:

-a-a-a-a-a-a---- 
-a------------a- 
Powiązane problemy