Angular RxJs Guard等待服务的BehaviorSubject具有价值

时间:2019-03-28 23:36:10

标签: angular rxjs rxjs6

为长文本致歉-只是设置场景。

我在Angular应用中使用AWS Amplify(Cognito)进行身份验证。 AWS Amplify提供了一个AmplifyService,该服务具有可观察到的authStateChange $,可提供有关身份验证状态的更新。

用户登录后,将会话存储在本地/ cookie存储中,因此,当页面重新打开/刷新等时,会话将从存储中返回。例如authStateChange $返回状态为“ signedIn”。

我还有一个用户会话(AppSession),其中包括当前用户会话的其他一些域信息。

ggplot(fall2, aes(Hall, total)) + 
  geom_col(aes(fill = total), width = 1) +
  guides(fill=FALSE) + 
  ggtitle("Fall Events by Hall") +
  facet_wrap(~Month, nrow = 1, scales = "free_x") +
  scale_x_discrete(expand = c(0,0))

由于该会话由多个组件使用,因此我将其作为我的UserStore中的BehaviorSubject公开。

//AppSession.ts
export interface Session {
    package?: PurchasedPackage;
    authState: string;
}

我想发生的事情是我想从authStateChange观察值在AppSession中设置authState属性。像

//UserStore.ts
@Injectable()
export class UserStore {
    private _session$: BehaviorSubject<AppSession>;

    get session(): Observable<Session> {
         return this._session$.asObservable();
    }
    ....
}

在我的应用中,我有一个主页,只有“ SignIn”用户可以看到。因此,我有一个“ UnauthenticatedGuard”来保护它,如下所示:

    //UserStore.ts

    constructor(private amplifyService: AmplifyService){
         /**
          * If the user logs in, then update their details.
         */
         this.amplifyService.authStateChanges$.subscribe(
              (event) => {
                   this._session = new BehaviorSubject({
                       authState: event.state
                   })
              }
         )
    }

}

现在的麻烦是,当我启动我的应用程序时,UnauthenticatedGuard在this.amplifyService.authStateChanges $ observable发出signedIn状态之前执行,因此,我得到:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.userStore.session.pipe(
  map((session) => {
    if(session && session.authState == "signedIn") {
      this.router.navigate(['/dashboard']);
      return false;
    }
    return true;
  })
)

如果,例如,我将BehaviorSubject设置为具有初始值“ null”(或任何其他值),那么Guard将认为用户未登录,因此允许访问。

如何仅在设置了BehaviorSubject的初始值后(即,一旦authStateChanges $ observable发出了它的值)就公开它?

0 个答案:

没有答案