链接Observable导致嵌套的observable

时间:2017-03-17 15:58:49

标签: angular angular2-observables

我是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是错误的,或者我是否正确地调用它。任何见解将不胜感激。感谢。

1 个答案:

答案 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>
}