Mam problemy z metodami RXJS, aby uzyskać to, czego potrzebuję.

this.tutorials$
  .pipe(
    map( data => data.map(item => item.id)), // returns [10,20,30,40]
    last()
  )
  .subscribe( console.log ); // returns nothing. Isn't supposed to return 40?

Chcę wyodrębnić ostatni element tablicy. Co ja robię źle? Czy jest lepszy sposób na bok ostatniej metody?

Dzięki.

2
GreatHawkeye 5 czerwiec 2018, 11:19

3 odpowiedzi

Najlepsza odpowiedź

Operator ostatni emituje element tylko wtedy, gdy obserwowalne uzupełnia. Nie wiem, co twoje samouczki $ obserwowalne robi, ale zgaduję, że to powód, dla którego nic nie jest zwrócone.

https://www.learnrxjs.io/perators/filtering/last.html.

Ponadto operatorzy RXJS działają w sekwencji emitowanych przedmiotów, a nie z samych przedmiotów emitowanych. Jeśli po prostu chcesz wyodrębnić ostatnią wartość tej tablicy, zrób to w operatorze Map () .

this.tutorials$
  .pipe(
    // will error on empty array, be more defensive here
    map( data => data[data.length-1].id)
    )
  .subscribe( console.log ); // return 40, every time the tutorials$ emits

Ale rozumiem twoje zamieszanie, zrobiłem dokładnie taki sam błąd, kiedy zacząłem korzystać z RXJS ...

3
Davy 5 czerwiec 2018, 09:31

Twój obserwowalny ma emitować samą tablicę, a nie elementy tablicy. Dlatego nie otrzymasz ostatniego przedmiotu, zamiast tego dostaniesz całą tablicę.

Zmodyfikuj swój kod w następujący sposób, aby uzyskać ostatni przedmiot w tablicy:

this.tutorials$
  .pipe(
   map( data => data.map(item => item.id)), // emit array
   concatMap(array=>from(array)), // emit array elements
   last() // get the last element
  )
  .subscribe( console.log ); 
1
siva636 5 czerwiec 2018, 08:32

Jest dwie rzeczy, których musisz być świadomy:

  1. Co to jest this.tutorials$ i robi to? Jeśli jest to tylko żądanie ajax, masz w porządku, ponieważ kończy się od razu, ale jeśli jest to temat z drugiej strony i nigdy nie zadzwonisz this.tutorials$.complete(), to łańcuch nigdy nie ukończy, a zatem {x2}} nie ukończy emituj wszystko, ponieważ nie wie, kiedy przychodzi ostatnia wartość.

  2. Jak wspomniałeś map(...) zwraca tablicę [10,20,30,40], ale last() emituje ostatnią emisję z jego źródła obserwowalne. Nie ostatni element w tablicy. Więc możesz w rzeczywistości chcieć użyć tylko map(ids => ids[ids.length -1]).

1
martin 5 czerwiec 2018, 09:23