导致嵌套观察值的链式观察结果
我是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不正确,或者如果我错误地调用它。任何洞察力将不胜感激。谢谢。
您需要导入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>
}
当canActivate守护程序向路由器返回observable时,路由器订阅它,不是吗? –
你是对的。卫兵可以返回路由器订阅的观察值。我会更新我的答案。 –
我没有看到任何呼叫mainFunction在您的守卫。看起来你也忘了在调用functionDoStuff时使用'this'。发布您的真实,实际的代码来重现错误。不是其他一些模糊的代码。 –
和'functionRetrieveStuff'代码 –
对不起,我不能发布完整的代码,所以我试图简化它到什么是需要说明我在做什么。我更新了我的代码。 –