2016-09-30 7 views
0

У меня есть гвардия, защищающая определенный маршрут. В методе canActive мне нужно сделать два HTTP-запроса, при которых второй запускается на основе ответа первого. Однако второй запрос никогда не выполняется, и я предполагаю, что он относится к вложенной конструкции возвращаемых Observables.Angular2: Вложенные наблюдаемые в гвардии

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() никогда не отправляется. Отладчик выходит молча в строке 5.

Еще одна вещи, машинопись показывает предупреждение, что, вероятно, говорит мне решение уже, однако, я слишком много нуба с наблюдаемыми характеристиками, в частности, знать, что с ним делать:

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

Чтобы угадать, конструкция Observables никогда не решает, поэтому нет предупреждения, и я жду до конца времени. Мое наивное понятие состояло в том, что до тех пор, пока любой Observable вернет логическое значение (как это сделано в строке 7), абонент будет знать, как его обрабатывать.

Я рад прочитать ваши намеки. Off спать ...

ответ

1

Вы должны использовать switchMap здесь:

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

В вашем коде, вы создаете наблюдаемый из наблюдаемых. switchMap сглаживает эту структуру и испускает испускаемые предметы от B до A.

+0

Всё. Полагаю, я сажусь и ухожу за полным учебником Observables. – Matt

+1

Пойдите для этого. Невероятно, что вы можете с ними сделать. Проверьте «rx marbles»! – j2L4e