导致嵌套观察值的链式观察结果

导致嵌套观察值的链式观察结果

问题描述:

我是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

对不起,我不能发布完整的代码,所以我试图简化它到什么是需要说明我在做什么。我更新了我的代码。 –

您需要导入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

你是对的。卫兵可以返回路由器订阅的观察值。我会更新我的答案。 –