2017-06-01 4 views
0

ログインのプロセスはかなり複雑で、将来的には簡単に追加できるようにスケーラビリティが必要です。したがって、最初はユーザーが通常の方法で認証され、ユーザーオブジェクトが返されます。次に、ユーザーにアプリケーションへのアクセス権が与えられる前に、さまざまな要件を決定する情報を取得するために追加のhttp呼び出しを行う必要があります。これは、ユーザーオブジェクトで返された値の一部を使用して行われます。現在のコードを変更せずにhttp呼び出しを簡単に追加できるようにコードを記述したいので、後続の呼び出しでfork joinを使用すると、並列処理が可能になるので良いでしょう。以下は私の作業コードです。別の観測値に続いてフォークジョインを使用する方が良い

私はフォークジョインコールに新しいリクエストを簡単に追加できます。ネストされたサブスクリプションにはコードの匂いや悪い習慣があると言われています。どのようにこれをより良くするためのアイデアは素晴らしいでしょう。

ありがとうございました。 concatMap()演算子を使用して、このような例

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

forkJoin

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は、彼らの両方フィニッシュまで待機します。

また、concatMap()は、Observableの内部が完了するまで待ってからさらに結果をプッシュします。

+0

はありがとうございます。それは完全に機能します。あなたの2人は同じ答えを両方落としましたが、あなたは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

関連する問題