61 votes

Angular 2 : pourquoi utiliser switchMap pour récupérer les paramètres d'une route ?

Je suis en train de lire le Guide Angular sur le routage et la navigation .

Ils utilisent ce code pour récupérer les paramètres du routeur. 'id' et l'utiliser pour obtenir un héros avec le service service :

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

Mais je ne comprends pas bien quel est le but de l'utilisation des switchMap dans le code ci-dessus.

Le code suivant ne serait pas le même ?

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)
    });
}

104voto

olsn Points 2270

switchMap est généralement utilisé lorsque vous avez une opération asynchrone qui est déclenchée par un "événement/flux" ajouté au début.

La différence avec par exemple flatMap o concatMap c'est-à-dire que dès que le déclencheur suivant est émis, l'opération asynchrone en cours est annulée et redéclenchée.

Dans votre cas, cela signifie que dès que les paramètres de l'itinéraire changent, votre service héroïque est automatiquement rappelé avec les paramètres modifiés et l'appel précédent est annulé afin que vous ne receviez pas de données périmées.

Cela est particulièrement utile pour les requêtes de recherche qui peuvent prendre plus de 200-300 ms et qui sont déclenchées pendant que l'utilisateur tape.

Le code suivant ne serait pas le même ?

Non. Bien qu'il puisse se comporter de la même manière dans de nombreux cas, si vous imaginez le scénario suivant :

  1. le paramètre devient "4".
  2. getHero(4) (une demande très lente)
  3. le paramètre devient "1".
  4. getHero(1) (une demande rapide)
  5. getHero(1) complète -> le héros est "1"
  6. getHero(4) complète -> le héros est maintenant "4" mais le dernier paramètre utilisé était "1".

Dans un tel cas switchMap rejetterait simplement le getHero(4) -Il n'est pas possible d'appeler le système car il est périmé dès qu'un nouveau déclencheur se produit.

0 votes

C'est très bien expliqué ! Une question : l'abonnement interne doit-il être retourné, par exemple implicitement en n'utilisant pas de parenthèses dans la fonction flèche ou avec (params)=>{ return .... }

0 votes

() => {...} retournera le type void par défaut. Avec switchMap vous devez retourner un Observable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X