2017-01-28 1 views
0

Ich habe folgende rxjs beobachtbaren Kette:Ist concatAll der richtige RxJS-Operator, um die Ordnung zu erhalten?

ngOnInit() { 
    this.route.params.map(params => params['userAccountToken']) 
     .switchMap(userAccountToken => this.userAccountService.activateAccount(userAccountToken)) 
     .switchMap(() => this.route.params.map(params => params['userAccountToken'])) 
     .switchMap(userAccountToken => this.signinService.signinByUserAccountToken(userAccountToken)) 
     .subscribe(() => this.router.navigate(['/dashboard'])); 
    } 

FYI, route vom Typ: ActivatedRoute.

Das Problem ist, dass ich versuche, die folgende beobachtbaren wiederzuverwenden:

route.params.map(params => params['userAccountToken']) 

Beachten Sie, wie ich dieses beobachtbaren duplizieren: zuerst, um das Konto zu aktivieren und dann den Benutzer signin ...

Ich versuche einen Weg zu finden, den Wert des Tokens wiederzuverwenden, aber ich bin mir nicht sicher, welcher Operator verwendet werden soll.

Die Reihenfolge der Aufrufe muss beibehalten werden. Ist concatAll hier angebracht?

Siehe unten für einen weiteren Versuch:

ngOnInit() { 
    this.route.params.map(params => params['userAccountToken']) 
     .mergeMap(userAccountToken => Observable.concatAll(
     this.userAccountService.activateAccount(userAccountToken), 
     this.sessionService.signinByUserAccountToken(userAccountToken) 
    )) 
     .subscribe(() => this.router.navigate(['/dashboard'])); 
    } 

Auch muss ich mergeMap oder switchMap auf dem route.param.map...?

+1

Haben Sie sich die Dokumentation schon angesehen? - http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-concatAll – olsn

+0

Danke für den Link. Ich habe mir zwar die Dokumente angeschaut, bin aber unsicher, welchen Betreiber ich bei meinem Anwendungsfall wählen soll. – balteo

+0

Aber Sie haben es wahrscheinlich noch nicht ausprobiert, richtig? Da 'concatAll' ein Operator und kein Observable-Creator ist, sollte' Observable.concatAll (...) 'den Fehler' is not a function' ausgeben. – olsn

Antwort

2

Sie könnten z.B. verschachteln zwei switchMaps:

this.route.params 
    .take(1) 
    .pluck('userAccountToken') 
    .switchMap(userAccountToken => { 
     return this.userAccountService.activateAccount(userAccountToken) 
      .switchMapTo(this.signinService.signinByUserAccountToken(userAccountToken)) 
    }) 
    .subscribe(() => this.router.navigate(['/dashboard'])); 
+0

Thanks olsn. Könnten Sie bitte etwas Ihren Code erklären? Vor allem die Notwendigkeit für das 'take (1)'? – balteo

+2

Die 'Take (1)' dient nur dazu, Speicherlecks zu verhindern, da 'route.params' ein kontinuierlicher Stream ist, der auch nach dem Entfernen der Komponente Daten ausgibt, was zu Speicherlecks führt - als Alternative könnten Sie sie behalten ein Verweis auf die Subskription und Abmelden auf zerstören oder verwenden Sie ein Muster mit 'takeUntil (someTriggerWhenDestroyingTheComponent)' - die 'take (1)' ist nur der schnellste Weg, um sicherzustellen, dass keine Speicherlecks passieren – olsn

Verwandte Themen