Запустить второй Observable - первый Observable - false - PullRequest
0 голосов
/ 20 июня 2020

Я создал следующий AuthenticatedGuard в Angular 9:

export class AuthenticatedGuard implements CanActivate {

  constructor(private authenticationService: AuthenticationService) { }

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

      return this.authenticationService.isSignedIn();

      this.authenticationService.signInRedirect({ state: { url: state.url }}).subscribe();

  }

}

Метод authenticationService.isSignedIn возвращает Observable<boolean>, а authenticationService.signInRedirect() возвращает Observable<any>.

поведение должно быть:

Если authenticationService.isSignedIn равно false, тогда выполните:

this.authenticationService.signInRedirect({ state: { url: state.url }}).subscribe();

Можно ли это сделать и по-прежнему использовать Observable?

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Вы можете await вызвать isSignedIn(), а затем выполнить signInRedirect() для перенаправления, как это, нам также нужно вернуть значение true/false.

async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
  const isSignedIn = awiat this.authenticationService.isSignedIn().first().toPromise();
  if (!isSignedIn) {
    this.authenticationService.signInRedirect({ state: { url: state.url }}).subscribe();
    return false;
  }
  return true;
}
1 голос
/ 20 июня 2020

Изменить охрану на: -

export class AuthenticatedGuard implements CanActivate {

  constructor(private authenticationService: AuthenticationService) { }

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

      return this.authenticationService.isSignedIn().pipe(tap((res)=> {
            if(!res) {
              this.authenticationService.signInRedirect({ state: { url: state.url }}).subscribe();
            }
      }));;

  }

}
...