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)
    });
}
Author: baijum, 2017-03-07

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:

  1. param cambia a"4"
  2. getHero(4) (una petición muy lenta)
  3. param cambia a"1"
  4. getHero(1) (una petición rápida)
  5. getHero(1) completa -> héroe es "1"
  6. 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.

 86
Author: olsn,
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