2016-09-30 7 views
0

私は特定のルートを保護するGuardを持っています。 canActiveメソッドでは、2つのhttp要求を作成する必要があります。最初の応答に基づいて2つ目のHTTP要求がトリガーされます。しかし、2番目のリクエストは決して行われず、Observablesを返すネストされたコンストラクタに関するものと仮定します。Angular2:Guardのネストされたオブザーバブル

1 canActivate(route: ActivatedRouteSnapshot, 
2   state: RouterStateSnapshot) : Observable<boolean>|boolean { 
3 return this.provider.getA().map(
4 dataA => { 
5  return this.provider.getB().map(
6  dataB => { 
7   return (dataB.allowed); 
8  } 
9  ); 
    } 
    ); 
} 

下駄()とgetB(両方)は、以下を返す:

getA() : Observable<any> { 
    return this.http.post(URL,payload). 
        map(response => response.json()); 

}。

コードは簡略化されていますが、getA()およびgetB()が正しく機能すると想定することがあります。 getA()は、Guardが呼び出されたときにネットワーク経由で正常に送信されますが、getB()は送信されません。デバッガはライン5

もう一つには静かに出て、活字体はおそらく既に私に解決策を伝える警告が、しかし、私はあまりそれをどのように処理するかを知るために、特に観測とNoobのだ示しています

Observable<Observable<boolean>>' is not assignable 
to type 'Observable<boolean>' 

Observablesの構成は決して解決しないため、警告が表示されず、時間の終了まで待っています。私の素朴な考え方は、Observableが(7行目で行ったように)ブール値を返す限り、加入者はそれをどのように扱うかを知っているということでした。

あなたのヒントをお読みいただきありがとうございます。ベッドにオフ...

答えて

1

あなたがここにswitchMapを使用する必要があります:あなたのコードで

return this.provider.getA().switchMap(
    dataA => { 
    return this.provider.getB().map(
     dataB => { 
     return (dataB.allowed); 
     } 
    ); 
    } 
); 

を、あなたは、観測の観測を作成しています。 switchMapはその構造をフラット化し、BからAの放出アイテムを放出します。

+0

それです。私は座ってObservablesの完全なチュートリアルのために行くと思います。 – Matt

+1

それを行ってください。あなたがそれらでできることは信じられないほどです。 「rx marbles」をチェックしてください! – j2L4e

関連する問題