Estoy leyendo la Guía angular sobre enrutamiento y navegación .
Usan este código para recuperar el 'id' del parámetro del enrutador y usarlo para obtener un héroe con el service de servicio:
ngOnInit() { this.route.params .switchMap((params: Params) => this.service.getHero(+params['id'])) .subscribe((hero: Hero) => this.hero = hero); } Pero no entiendo bien cuál es el propósito de usar el operador switchMap en el código anterior.
¿El siguiente código no sería el mismo?
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) }); }switchMap generalmente se usa cuando tiene alguna operación asíncrona que se desencadena por algún "evento/flujo" antepuesto.
La diferencia con, por ejemplo flatMap o concatMap es que tan pronto como se emite el siguiente disparador, la operación asíncrona actual se cancela y se vuelve a disparar.
En su caso, esto significa que tan pronto como cambien los parámetros de ruta, su servicio de héroe se llamará automáticamente nuevamente con los parámetros modificados y la llamada anterior se cancelará para que no reciba datos obsoletos.
Esto es especialmente útil para consultas de búsqueda que pueden tardar más de 200-300 ms y se activan mientras el usuario escribe.
¿El siguiente código no sería el mismo?
No. Si bien podría comportarse de la misma manera en muchos casos, imagina el siguiente escenario:
getHero(4) (una solicitud muy lenta)getHero(1) (una solicitud rápida)getHero(1) se completa -> el héroe es "1"getHero(4) se completa -> el héroe ahora es "4" pero el último parámetro utilizado fue "1" En tal caso, switchMap simplemente descartaría la llamada a getHero(4) ya que está desactualizada tan pronto como ocurre un nuevo desencadenante.