Angular 2: ¿por qué usar switchMap al recuperar parámetros de ruta?
Estoy leyendo la Guía Angular sobre Enrutamiento y Navegación.
Usan este código para recuperar el param del router 'id'
y usarlo para obtener un héroe con el servicio service
:
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)
});
}
1 answers
switchMap
generalmente se usa cuando tiene alguna operación asincrónica que se desencadena por algún "evento/secuencia" antepuesto.
La diferencia con flatMap
o concatMap
es que tan pronto como se emita el siguiente disparador, la operación asincrónica actual se cancela y se vuelve a activar.
En su caso esto significa, que tan pronto como los parámetros de ruta cambian, su servicio hero se llama automáticamente de nuevo con los parámetros cambiados y la llamada anterior se cancela para que no reciba obsoletos datos.
Esto es especialmente útil para consultas de búsqueda que pueden tomar más tiempo que 200-300ms y se activan mientras un usuario está escribiendo.
El siguiente código no sería el mismo?
No. Si bien podría comportarse igual en muchos casos, si se imagina el siguiente escenario:
- param cambia a"4"
-
getHero(4)
(una petición muy lenta) - param cambia a"1"
-
getHero(1)
(una petición rápida) -
getHero(1)
completa -> héroe es "1" -
getHero(4)
completa - > hero es ahora " 4 "pero el último param usado fue" 1 "
En tal caso, switchMap
simplemente descartaría la llamada getHero(4)
-ya que está desactualizada tan pronto como ocurra un nuevo disparador.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-23 17:10:26