2017-03-17 86 views
1

我是RxJS和觀察對象的新手,所以我仍然試圖圍繞正確的方式來做事情。導致嵌套觀察值的鏈式觀察結果

我有兩個功能:

functionRetrieveStuff() : Observable<MyObject> {} 

functionDoStuff(param1: MyObject) : Observable<boolean> {} 

RetrieveStuff的輸出是用於DoStuff輸入。

mainFunction() : Observable<boolean> { 
    return this.functionRetrieveStuff().map(response => { 
     return this.functionDoStuff(response); 
    }) 
} 

這將導致以下編譯錯誤:我下面把這些從代替

Error:(33, 16) TS2322: Type 'Observable<Observable<boolean>>' is not assignable to type 'Observable<boolean>'. 

類型「可觀察」是不能分配給輸入「布爾」。

如果我正確閱讀reactivex.io的文檔,我認爲我的問題的解決方案是switchMap。所以,如果更新我的mainFunction這樣:

mainFunction() : Observable<boolean> { 
    return functionRetrieveStuff().switchMap(response => { 
     return functionDoStuff(response); 
    }) 
} 

的編譯錯誤消失,但是當我使用mainFunction在我canActivate後衛,當我嘗試使用的功能我得到一個錯誤:

TypeError: Cannot read property 'switchMap' of undefined 

以下是我在我的canActivate後衛的canActivate方法使用mainFunction:

return this.mainFunction().first().map(result => { 
     return true; 
    }); 

所以我不知道如果我使用mainFunction不正確,或者如果我錯誤地調用它。任何洞察力將不勝感激。謝謝。

+0

我沒有看到任何呼叫mainFunction在您的守衛。看起來你也忘了在調用functionDoStuff時使用'this'。發佈您的真實,實際的代碼來重現錯誤。不是其他一些模糊的代碼。 –

+0

和'functionRetrieveStuff'代碼 –

+0

對不起,我不能發佈完整的代碼,所以我試圖簡化它到什麼是需要說明我在做什麼。我更新了我的代碼。 –

回答

0

您需要導入switchMap

import 'rxjs/add/operator/switchMap'; 

,然後用它就像你在此:

mainFunction() : Observable<boolean> { 
    return this.functionRetrieveStuff().switchMap(response => this.functionDoStuff(response)); 
} 

由於路由器可以自動訂閱可觀察,你會希望你canActivate函數查找像這樣:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 
    return this.mainFunction().first(); //this return Observable<boolean> since functionDoStuff is Observable<boolean> 
} 
+0

當canActivate守護程序向路由器返回observable時,路由器訂閱它,不是嗎? –

+0

你是對的。衛兵可以返回路由器訂閱的觀察值。我會更新我的答案。 –