2016-09-30 54 views
0

我有一個Guard保護某個路線。在canActive方法中,我需要創建兩個http請求,第二個http請求是基於第一個響應觸發的。然而,第二個請求從來沒有做過,我認爲它是關於返回Observables的嵌套構造。Angular2:Guard中的嵌套Observable

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()可以正常工作。但是,當Guard被調用時,getA()會在網絡上正常發送,但getB()不會被髮送。調試器的線而自行退出5.

一兩件事,但是打字稿顯示一個警告,可能告訴我已經解決,我是個太過與觀測量尤其是菜鳥知道用它做:

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展平該結構並通過A發射B的發射項目。

+0

就是這樣。我想我會坐下來看看完整的Observables教程。 – Matt

+1

去吧。這是令人難以置信的,你可以用它們做什麼。看看'rx彈珠'! – j2L4e