wake-up-neo.net

Angular 2: Warum sollte switchMap zum Abrufen von Routenparametern verwendet werden?

Ich lese die Angular Guide über Routing & Navigation .

Sie verwenden diesen Code, um den Parameter 'id' Des Routers abzurufen und damit einen Helden mit dem Dienst service zu erhalten:

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

Aber ich verstehe nicht genau, wozu der switchMap -Operator im obigen Code verwendet wird.

Der folgende Code wäre nicht der gleiche?

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

switchMap wird normalerweise verwendet, wenn Sie eine asynchrone Operation ausführen, die durch ein vorangestelltes "Ereignis/Stream" ausgelöst wird.

Der Unterschied zu z.B. flatMap oder concatMap bedeutet, dass die aktuelle asynchrone Operation abgebrochen und erneut ausgelöst wird, sobald der nächste Trigger ausgelöst wird.

In Ihrem Fall bedeutet dies, dass sobald sich die Routenparameter ändern, Ihr Heldendienst automatisch mit den geänderten Parametern erneut aufgerufen wird und der vorherige Anruf abgebrochen wird, so dass Sie keine veralteten Daten erhalten.

Dies ist besonders hilfreich bei Suchanfragen, die länger als 200-300 ms dauern und ausgelöst werden, während ein Benutzer tippt.

Der folgende Code wäre nicht der gleiche?

Nein, obwohl es sich in vielen Fällen gleich verhält, wenn Sie sich folgendes Szenario vorstellen:

  1. parameter ändert sich auf "4"
  2. getHero(4) (eine sehr langsame Anfrage)
  3. parameter ändert sich auf "1"
  4. getHero(1) (eine schnelle Anfrage)
  5. getHero(1) beendet -> Held ist "1"
  6. getHero(4) beendet -> hero ist jetzt "4", aber der zuletzt verwendete Parameter war "1"

In einem solchen Fall würde switchMap den getHero(4)- -Aufruf einfach verwerfen, da er veraltet ist, sobald ein neuer Trigger auftritt.

96
olsn