Ожидание загрузки службы аутентификации до того, как охрана вернет результат - PullRequest
0 голосов
/ 05 июля 2019

Моя служба аутентификации имеет следующие субъекты поведения

public isLoggedIn$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
public isLoaded$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);

Когда пользователь уже вошел на сайт, службе аутентификации требуется секунда, чтобы загрузить и установить для isLoggedIn $ значение true. Есть ли способ ждать следующего значения поведения, которое может измениться, прежде чем вернуться? Я представляю, что это выглядит примерно так

export class AuthGuard implements CanActivate {
    private authLoaded = false;
    private loggedIn = false;

    constructor(
        private authService: AuthService,
        private router: Router,
        private toast: ToastrService,
    ) {
        authService.isLoggedIn$.subscribe(loggedIn => {
            this.loggedIn = loggedIn;
        });

        authService.isLoaded$.subscribe(authLoaded => {
            this.authLoaded = authLoaded;
        });
    }

    canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot,
    ): Observable<boolean> | boolean {
        if (this.authLoaded === false) {
            this.authService.isLoggedIn$.subscribe..awaitForNextValue..(loggedIn => {
                this.loggedIn = loggedIn;
                return of(this.loggedIn);
            });
        } else {
            return this.loggedIn;
        }
    }
}

1 Ответ

1 голос
/ 05 июля 2019

В документах CanActivate проверьте типы возвращаемых данных. Если вы вернете логическое значение вместо других (Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree), оно будет выполняться синхронно, а не асинхронно.

Кроме того, охранники будут выполнять в том порядке, в каком они находятся в массиве охранников для этого маршрута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...