我是RxJS和Observables的新手,所以我仍然试图绕着正确的方式做事。
我有两个功能:
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>'.
键入&#39; Observable&#39;不能分配给&#39;布尔&#39;。
如果我正确地阅读reactivex.io上的文档,我认为我的问题的解决方案是switchMap。所以,如果我将mainFunction更新为:
mainFunction() : Observable<boolean> {
return functionRetrieveStuff().switchMap(response => {
return functionDoStuff(response);
})
}
编译错误消失了,但是当我尝试使用该函数时,当我在canActivate防护中使用mainFunction时出现错误:
TypeError: Cannot read property 'switchMap' of undefined
以下是我在canActivate后卫的canActivate方法中使用mainFunction的方法:
return this.mainFunction().first().map(result => {
return true;
});
所以我不确定我是否使用mainFunction是错误的,或者我是否正确地调用它。任何见解将不胜感激。感谢。
答案 0 :(得分:0)
您需要导入switchMap
import 'rxjs/add/operator/switchMap';
然后就像你在这里一样使用它:
mainFunction() : Observable<boolean> {
return this.functionRetrieveStuff().switchMap(response => this.functionDoStuff(response));
}
由于路由器可以自动订阅observable,你需要你的canActivate函数看起来像这样:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.mainFunction().first(); //this return Observable<boolean> since functionDoStuff is Observable<boolean>
}