I am kind of new to RxJS, In this plunk
I am trying to return the first member in the array, I have tried the first()
operator but it returns nothing:
var one = this.http.get(this.memberUrl)
.map( this.extractData )
.map(processArray => {
return processArray.filter(x=> x.type === "member")
//.first()
})
Whats wrong with the commented line in app/member.service.ts
?
When you use .map()
, its argument is the type of the Observable
.
Since the one you have in your service is an Observable<Member[]>
, then processArray
in
.map(processArray => {
return processArray.filter(x=> x.type === "member")
//.first()
})
is an array - a Member[]
.
Thus that .filter()
you are calling is Array#filter()
not Observable#filter()
.
The same way the .first()
you would be calling would be Array#first()
not Observable#first()
.
Since Array
does not have a .first()
array, it yields a runtime error (see plunker).
Going further, if you instead call .first()
at the Observable
, you wouldn't see much difference, since it is an Observable<Member[]>
, it would get the first element of that Observable
which is the whole array.
If you really want it to keep being an Observable<Member[]>
and retrieve just the first member, you could do (see plunker):
.map(processArray => {
console.log('pa2', typeof processArray);
return [ processArray.filter(x=> x.type === "member")[0] ] // <-- [0] to get first item
// wrap the result in [ ]s, because it expects an array
})
Though what I advise you to do is to turn the observable into an Observable<Member>
(instead of Observable<Member[]>
). You can do that using .mergeMap()/.flatMap()
.
import 'rxjs/add/operator/mergeMap'; // <------------------ add this import
getMembers (): Observable<Member> { // <----------- changed from Member[] to Member
var one = this.http.get(this.memberUrl)
.map( this.extractData )
.mergeMap(processArray => { // <----------------- map to mergeMap
return processArray.filter(x=> x.type === "member")
}).first() // <----------------------- now you can use .first()
import 'rxjs/add/operator/toArray'; // <------------------ add this import
...
getMembers() {
this.memberService.getMembers().toArray() // <-------------- add .toArray()
.subscribe(
See final demo plunker here.
I was able to access the Observable's first member by using angular's async pipe.
ypurComponent.html
(yourObservable | async | slice :0:1)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With