Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular 2: why use switchMap when retrieving route params?

I'm reading the Angular Guide about Routing & Navigation.

They use this code for retrieving the router's param 'id' and using it to get a hero with the service service:

ngOnInit() {   this.route.params     .switchMap((params: Params) => this.service.getHero(+params['id']))     .subscribe((hero: Hero) => this.hero = hero); } 

But I do not well understand what is the purpose of using the switchMap operator in the above code.

The following code would not be the same?

ngOnInit() {   this.route.params     // NOTE: I do not use switchMap here, but subscribe directly     .subscribe((params: Params) => {       this.service.getHero(+params['id']).then(hero => this.hero = hero)     }); } 
like image 843
Andrea Avatar asked Mar 07 '17 18:03

Andrea


People also ask

When would you use a switchMap?

switchMap could be used — when a new search is made, pending results are no longer needed; and. exhaustMap should not be used — searches for new, partial addresses should not be ignored.

What is the use of switchMap in angular?

The Angular SwitchMap maps each value from the source observable into an inner observable, subscribes to it, and then starts emitting the values from it. It creates a new inner observable for every value it receives from the Source.

What is one of the key benefits of the switchMap observable operator?

The switchMap operator maps each value to an observable, then it flattens all of the inner observables. It basically projects each source value to an observable which is then merged in the output observable, emitting values only from the most recently projected observable.

What is switchMap in RXJS?

switchMaplinkProjects each source value to an Observable which is merged in the output Observable, emitting values only from the most recently projected Observable.


1 Answers

switchMap is usually used when you have some async operation that is triggered by some prepended "event/stream".

The difference to e.g. flatMap or concatMap is, that as soon as the next trigger emits, the current async operation is canceled and re-triggered.

In your case this means, that as soon as the route-params change, your hero-service is automatically called again with the changed params and the previous call is canceled so you won't receive outdated data.

This is especially helpful for search-queries that might take longer then 200-300ms and are triggered while a user is typing.

The following code would not be the same?

No. While it might behave the same in many cases, if you imagine the following scenario:

  1. param changes to "4"
  2. getHero(4) (a very slow request)
  3. param changes to "1"
  4. getHero(1) (a fast request)
  5. getHero(1) completes -> hero is "1"
  6. getHero(4) completes -> hero is now "4" but the last used param was "1"

In such a case switchMap would just discard the getHero(4)-call since it is outdated as soon as a new trigger happens.

like image 120
olsn Avatar answered Oct 11 '22 18:10

olsn