How To Create An Observable Within An Observable In Angular2
Solution 1:
It appears that you're misunderstanding what an RxJS operator (like map
, filter
, etc) actually returns, and I think correcting that will make the solution clear.
Consider this short example:
allEventsObserve
.map(events => {
return'this was an event';
})
Granted, it's a pretty useless example since all of the data from events
is lost, but let's ignore that for now. The result of the code above is not an array of strings or anything else, it's actually another Observable
. This Observable will just emit the string 'this was an event'
for each array of events emitted by allEventsObserve
This is what allows us to chain operators on observables -- each operator in the chain returns a new Observable
that emits items that have been modified in some way be the previous operator.
allEventsObserve
.map(events => {
return'this was an event';
})
.filter(events =>typeof events !== 'undefined')
allEventsObserve
is obviously an Observable
, allEventsObserve.map()
evaluates to an Observable
, and so does allEventsObserve.map().filter()
.
So, since you're expecting your function to return an Observable
, you don't want to call subscribe just yet, as doing so would return something that isn't really an Observable
.
With that in mind, your code can be rewritten in the following way:
publicgetEvents(key:string,value:string) : Observable<Array<any>> {
var allEventsObserve : Observable<Array<any>> = this.getHTTPEvents();
return allEventsObserve
.map(events => {
var match = events.filter(event => event[key] == value);
if (match.length == 0) {
throw'no matching event found';
} else {
return match[0];
}
})
.catch(e => {
console.log(e);
return e;
});
}
Since getEvents
returns an Observable
, somewhere else in your code you would do something like getEvents().subscribe(events => processEvents())
to interact with them. This code also assumes that this.getHTTPEvents()
returns an Observable
.
Also, notice that I changed your for loop to a call to filter
, which operates on arrays. events
in this case is a plain-old JavaScript Array
, so the filter
that is getting called is not the same filter
as the RxJS operator filter
.
Post a Comment for "How To Create An Observable Within An Observable In Angular2"