2016-03-28 26 views
10

Zaczynam z RxJs (przy użyciu wersji beta wersji beta), ale jakoś nie mogę wymyślić, jak pracować z distinctUntilChanged. Dane wyjściowe z poniższego kodu, jeśli uruchomię go w węźle Babel, to:Jak korzystać z RxJs distinctUntilChanged?

[ 'a', 1 ] 
{ key: 'a', state: 1 } 
Next: { value: 42 } 
Completed 

Nie tego się spodziewać. Dlaczego tylko jedna pozycja przechodzi distinctUntilChanged? Spodziewam się, wyjście będzie

[ 'a', 1 ] 
[ 'a', 0 ] 
[ 'a', 1 ] 
{ key: 'a', state: 1 } 
{ key: 'a', state: 2 } 
{ key: 'a', state: 0 } 
{ key: 'a', state: 1 } 
Next: { value: 42 } 
Next: { value: 24 } 
Completed 

Oto kod

import {Observable} from 'rxjs' 

Observable.of(['a', 1], ['a', 1], ['a', 0], ['a', 1]) 
    .distinctUntilChanged(x => x[1]) 
    .subscribe(x => console.log(x)) 

Observable.of({key: 'a', state: 1}, {key: 'a', state: 2}, {key: 'a', state: 0}, {key: 'a', state: 1}) 
    .distinctUntilChanged(x => x.state) 
    .subscribe(x => console.log(x)) 

Observable.of({value: 42}, {value: 42}, {value: 24}, {value: 24}) 
    .distinctUntilChanged(x => x.value) 
    .subscribe(
    function (x) { 
     console.log('Next: ', x) 
    }, 
    function (err) { 
     console.log('Error: ' + err) 
    }, 
    function() { 
     console.log('Completed') 
    } 
) 

links w docs V5 dla tych funkcji wydaje się być martwy

------ edit - ---

Niektóre dodatkowe debugowanie:

Observable.of(['a', 1], ['a', 1], ['a', 0], ['a', 1]) 
    .do(x => console.log('before', x)) 
    .distinctUntilChanged(x => x[1]) 
    .do(x => console.log('after', x)) 
    .subscribe(x => console.log(x)) 

wyjściowa:

before [ 'a', 1 ] 
after [ 'a', 1 ] 
[ 'a', 1 ] 
before [ 'a', 1 ] 
before [ 'a', 0 ] 
before [ 'a', 1 ] 
+0

Również dla tego rodzaju debugowania pytanie, należy uwzględnić oczekiwane zachowanie, a najlepiej pokazać pewne próby debugowania. – user3743222

+0

OK Dodałem oczekiwane wyjście –

Odpowiedz

24

Dostałem odpowiedź here. Zasadniczo zmieniono sygnaturę funkcji z (wybieraka klawiszy, komparatora) na (komparator, selektor klawiszy).

ten sposób przykładem jest wykonywana w v5:

Observable.of(['a', 1], ['a', 1], ['a', 0], ['a', 1]) 
    .distinctUntilChanged(null, x => x[1]) 
    .subscribe(x => console.log(x)) 
+0

Dzięki, to mi bardzo pomogło dzisiaj! – qur2

1

Oto sample z kodem jest Rxjs V4. Przekonasz się, że działa poprawnie.

Observable.of(['a', 1], ['a', 1], ['a', 0], ['a', 1]) 
    .distinctUntilChanged(x => x[1]) 
    .subscribe(x => console.log(x)) 
... 

Wygląda więc na to, że jest coś w nowej wersji beta. Oto specyfikacje dla distinctUntilChanged. Sam operator wydaje się działać tak jak w wersji 4.

Aby przetestować różne rzeczy, polecam prześledzić wyjście każdej funkcji, wstawiając .do(function(x){console.log(x)}) pomiędzy operatorami. Mogę myśleć tylko o tym, że operator of może przekazać tylko ostatni element tablicy.

+0

Dzięki, dam v4 iść później! –

+0

w porządku, możesz spróbować teraz z 'Observable.from' zamiast' Observable.of' (wstaw wszystkie tablice w tablicy)? Czy możesz też spróbować tego samego z 'of' ale zmień' 'a ', 1' na'' b ', 1'. Wydaje się, że operator 'of' przyjmuje tylko ostatni lub pierwszy argument, który mijamy. – user3743222

+0

Mogę potwierdzić, że v4 działa. Wygląda na to, że v5 jest zepsuty lub przynajmniej własna dokumentacja jest niepoprawna. Kod "z kluczowym selektorem" [tutaj] (https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/distinctuntilchanged.md) ma ten sam problem co ja mając w v5, więc domyślam się, że utworzę problem na githubie dla tego –