【问题标题】:Await for authentication service to load before guard returns result在警卫返回结果之前等待身份验证服务加载
【发布时间】:2019-07-05 19:15:18
【问题描述】:

我的认证服务有这些行为主体

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;
        }
    }
}

【问题讨论】:

标签: angular rxjs


【解决方案1】:

CanActivate 文档中,检查返回类型。如果您返回布尔值而不是其他值 (Observable&lt;boolean | UrlTree&gt; | Promise&lt;boolean | UrlTree&gt; | boolean | UrlTree),它将同步执行而不是异步执行。

此外,守卫将按照他们在该路线的守卫数组中的顺序执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-30
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多