2016-09-30 56 views
0

我有一个Guard保护某个路线。在canActive方法中,我需要创建两个http请求,第二个http请求是基于第一个响应触发的。然而,第二个请求从来没有做过,我认为它是关于返回Observables的嵌套构造。Angular2:Guard中的嵌套Observable

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  ); 
    } 
    ); 
} 

两者木屐()和getB()返回以下:

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

};

代码被简化了,但您可能会认为getA()和getB()可以正常工作。但是,当Guard被调用时,getA()会在网络上正常发送,但getB()不会被发送。调试器的线而自行退出5.

一两件事,但是打字稿显示一个警告,可能告诉我已经解决,我是个太过与观测量尤其是菜鸟知道用它做:

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

为了猜测,Observables的构造从未解决,这就是为什么没有警告,我等到时间结束。我天真的想法是,只要任何Observable会返回一个布尔值(如第7行所示),用户就会知道如何处理它。

我很高兴看到您的提示。去睡觉......

回答

1

你应该switchMap在这里使用:

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

在代码中,要创建一个可观察观察量。 switchMap展平该结构并通过A发射B的发射项目。

+0

就是这样。我想我会坐下来看看完整的Observables教程。 – Matt

+1

去吧。这是令人难以置信的,你可以用它们做什么。看看'rx弹珠'! – j2L4e