2017-06-01 66 views
0

我有一個登錄過程,具有相當複雜的登錄變體,必須可擴展以便在未來輕鬆添加更多。所以最初以典型的方式驗證用戶並返回用戶對象。然後,我必須進行額外的http調用才能獲得信息,以便在用戶被授予對應用程序的訪問權限之前確定各種要求。這是使用用戶對象中返回的一些值完成的。我想以一種可以方便地添加http調用而不改變當前代碼的方式編寫代碼,所以我認爲使用fork聯接進行後續調用會很好,因爲它們可以並行完成。以下是我的工作代碼。更好的方式使用另一個可觀察到的後續fork連接

我可以很容易地將新的請求添加到fork join調用中,雖然它對我來說看起來並不糟糕我被告知嵌套訂閱是一種代碼異味,通常是不好的做法。如何更好地做到這一點的任何想法都會很棒。

謝謝。

this.authenticate.login(this.model) 
    .subscribe(
    _data => { 
     this.subscription = Observable.forkJoin(
     this.devicesHttp.getDevicesByMacAddress(this.macAddress), 
     this.teamsService.getTeamsByUserId(_data['userId']) 
    ); 

     this.subscription.subscribe(
     _data => { 
      // Check login type and other stuff... 
     } 
    ); 
    } 
); 

回答

0

例如像這樣使用concatMap()操作:

this.authenticate.login(this.model) 
    .concatMap(_data => Observable.forkJoin(
     this.devicesHttp.getDevicesByMacAddress(this.macAddress), 
     this.teamsService.getTeamsByUserId(_data['userId']) 
    )) 
    .subscribe(_data => { 
      // Check login type and other stuff... 
    }); 

的觀在forkJoin將並行運行,forkJoin將等待,直到他們都完成。

concatMap()等待,直到內部Observable完成,然後進一步推動結果。

+0

謝謝。這是完美的。你們兩個都放棄了相同的答案,但是你以45秒的時間擊敗了另一個。 – Aaron

0

如何:

this.authenticate.login(this.model) 
    .switchMap(data => Observable.forkJoin(
    this.devicesHttp.getDevicesByMacAddress(this.macAddress), 
    this.teamsService.getTeamsByUserId(data['userId']) 
)) 
    .subscribe(...,...) 
+0

感謝您的回覆。這種方法運作良好。 – Aaron

相關問題