Цепные наблюдаемые и обещания - PullRequest
0 голосов
/ 09 сентября 2018

Я создаю приложение, используя Firebase Auth (AngularFire) с Angular 6. У меня также есть служба MongoDB для Role-Base-Access (RBA)

Мне нужно сделать 3 вещи, чтобы определить, может ли пользователь получить доступ к URL-пути:

  1. Прослушивание Firebase authState Observable для текущего пользователя
  2. Получить его последний идентификатор токена
  3. Проверьте MongoDB, разрешен ли пользователю доступ к URL

Когда все 3 пройдут, он должен вернуть true

Я немного изучил Observables, но все еще чувствую себя сбитым с толку, тем более что я использую rxjs 6, и многие ссылки до сих пор ссылаются на-5.5

Это моя функция canActivate прямо сейчас:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) 
{

     return this.authService.user$.pipe(map (user => {

         //user.getIdToken() returns a Promise so I wrap it in an Observable
         return from(user.getIdToken());

     })).pipe(map( tokenValue => {

          //tokenValue is an Observable here 
          this.mongoDBService.validate(tokenValue, state.url);
     }));
}

Я ожидал, что второй «канал» прослушает и получит результат от (user.getIdToken ())

Разве не так это должно работать? Если нет, то может кто-нибудь подсказать мне, как соединить эти 2 наблюдаемые вместе?

Спасибо

1 Ответ

0 голосов
/ 09 сентября 2018

Вам нужно использовать switchMap (который объединяет наблюдаемый результат в основной поток) вместо map (который просто отображает испущенное значение в другое). Также вы можете использовать трубу только один раз:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
  return this.authService.user$.pipe(
    switchMap (user => from(user.getIdToken())),
    switchMap(tokenValue => this.mongoDBService.validate(tokenValue, state.url))
  );
}

Я не уверен, что такое user.getIdToken() и нужно ли вам вообще from. Тем не менее, вы должны решить эту главную проблему.

...