Angular2:Guard中的嵌套Observable

时间:2016-09-30 22:06:21

标签: angular typescript router observable guard

我有一名警卫保护某条路线。在canActive方法中,我需要发出两个http请求,根据第一个响应触发第二个http请求。但是,第二个请求永远不会发生,我认为它是关于返回Observables的嵌套构造。

1 canActivate(route: ActivatedRouteSnapshot,
2          state: RouterStateSnapshot) : Observable<boolean>|boolean {
3  return this.provider.getA().map(
4    dataA => {
5      return this.provider.getB().map(
6        dataB => {
7          return (dataB.allowed);
8        }
9      );
     }
   );  
 }

getA()和getB()都返回以下内容:

getA() : Observable<any> {
  return this.http.post(URL,payload).
                   map(response => response.json());

};

代码已简化,但您可以假设getA()和getB()正常工作。调用Guard时,getA()在网络上发送,但是从不发送getB()。调试器在第5行静默退出。

还有一件事,TypeScript显示的警告可能已经告诉我解决方案了,但是,我太多了Noob with Observables特别知道如何处理它:

Observable<Observable<boolean>>' is not assignable 
to type 'Observable<boolean>'

为了猜测,Observables的构造永远不会解析,这就是没有警告的原因,我等到时间结束。我天真的想法是,只要任何Observable都返回一个布尔值(如第7行所做),订阅者就会知道如何处理它。

我很高兴看到你的提示。上床睡觉......

1 个答案:

答案 0 :(得分:2)

您应该在这里使用switchMap

return this.provider.getA().switchMap(
  dataA => {
    return this.provider.getB().map(
      dataB => {
        return (dataB.allowed);
      }
    );
  }
);

在您的代码中,您正在创建一个Observable of Observables。 switchMap展平该结构,并通过A发出B的发射项。