Подождите, пока две наблюдаемые завершат порядок в Angular Auth Guard

Вот мой Angular Auth Guard. Он проверяет состояние входа в систему, затем получает от него идентификатор, если он существует, и проверяет профиль, назначенный этому идентификатору. Я пытаюсь разрешить охрану, ожидающую завершения этих двух наблюдаемых в порядке с помощью метода zip, но checkProfileOnline возвращает ошибку, потому что uid не определен, поэтому не ожидает завершения первой наблюдаемой.

@Injectable()
export class AuthGuard implements CanActivate {

  constructor(
    private authService: AuthService,
    private userService: UserService,
    private router: Router
  ) {}

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

    let obsArray: Observable<boolean>[] = [];
    obsArray.push(this.checkAuthOnline(), this.checkProfileOnline());

    // CHECK FOR AUTH AND PROFILE ONLINE
    return Observable.zip(obsArray).map(res => {
      if (res[0] && res[1]) {
        return true;
      }
      return false;
    });
  }

  checkProfileOnline(): Observable<boolean> {
    return this.userService.userCheck(this.authService.uid).map(profile => {
      if (profile) {
        this.userService.user = profile;
        return true;
      }
      this.router.navigate(['/']);
      return false;
    });
  }

  checkAuthOnline(): Observable<boolean> {
    return this.authService.authStatus().map(loggedIn => {
      if (loggedIn) {
        this.authService.uid = loggedIn.uid;
        return true;
      }
      return false;
    });
  }

}

1 ответ

Решение

Вместо zip вы можете подождать, пока закончится первая наблюдаемая concatMap а затем запустить второй на. Тогда второй результат будет сопоставлен с && операция на них обоих.

return checkAuthOnline()
  .concatMap(res1 => checkProfileOnline()
    .map(res2 => res1 && res2)
)
Другие вопросы по тегам