2016-09-30 3 views
0

특정 경로를 보호하는 Guard가 있습니다. canActive 방법에서는 두 번째 HTTP 요청을 만들어야하는데, 두 번째 요청은 첫 번째 응답의 응답을 기반으로 트리거됩니다. 그러나 두 번째 요청은 결코 만들어지지 않으며 Observables를 반환하는 중첩 된 구성에 대한 것이라고 가정합니다.Angular2 : Guard의 중첩 관찰자

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()가 제대로 작동한다고 가정 할 수 있습니다. getA()는 Guard가 호출 될 때 네트워크를 통해 정상적으로 전송되지만 getB()는 전송되지 않습니다. 디버거는 내가 그것으로 무엇을 알고 특히 Observables은 너무 많이 멍청한 놈이야, 타이프 라이터 그러나, 아마 이미 나에게 해결책을 알려주는 경고를 표시 줄에 자동으로 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); 
     } 
    ); 
    } 
); 

을, 당신은 Observable 인의 관찰 가능한을 만들 수 있습니다. switchMap은 구조체를 평평하게 만들고 B부터 A까지 내 보낸 항목을 내 보냅니다.

+0

그게 전부입니다. 나는 앉아서 Observables 전체 자습서를 보러 갈 것입니다. – Matt

+1

가십시오. 당신이 그들과 함께 할 수있는 것은 놀라운 것입니다. 'rx marbles'를 확인하십시오! – j2L4e