2017-01-28 77 views
0

我有以下rxjs可觀察到的鏈:爲了維護秩序,連接所有RxJS運營商?

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的類型爲:ActivatedRoute

的問題是,我想重複使用以下物品觀察到:

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

注意我是如何複製此觀察到:第一,以激活帳號,然後簽到用戶...

我想找到一種方法來重用令牌的值,但我不確定要使用哪個運算符。

調用的順序需要保留。 concatAll在這裏適合嗎?

請參閱以下的另一種嘗試:

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

而且,我需要mergeMapswitchMaproute.param.map...

+1

你有沒有看過文檔呢? - http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-concatAll – olsn

+0

感謝您的鏈接。我的確看過這些文檔,但我不確定哪個運營商可以選擇我的用例。 – balteo

+0

但是你可能還沒有嘗試過,對嗎?因爲'concatAll'是一個操作符而不是Observable-creator,所以'Observable.concatAll(...)'應該拋出一個錯誤'不是函數'。 – olsn

回答

2

你可以例如嵌套兩個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

謝謝olsn。你能解釋一下你的代碼嗎?特別是「take(1)'的必要性? – balteo

+2

'take(1)'只是爲了防止內存泄漏,因爲'route.params'是一個連續的流,它將保持發送數據,即使在組件被移除後,這將導致內存泄漏 - 作爲替代方案,您可以保留對訂閱和取消訂閱的引用銷燬或使用帶有'takeUntil(someTriggerWhenDestroyingTheComponent)'的模式 - 「take(1)'是確保不發生內存泄漏的最快捷方式 – olsn