简体   繁体   English

CanActivate 等待并从商店取走

[英]CanActivate wait and take from store

I have next method in my class which implements from CanActivate:我的 class 中有下一个方法,它从 CanActivate 实现:

export class CanActivateLoginedInforamtion implements CanActivate {
  constructor(private store: Store<AppState>) {}

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<boolean>{
    return timer(10000).pipe(
      () => this.store.select(({ user: { loginState }}) => {          
        console.log(loginState); 
        return loginState === 'LOGINED' 
      })
    );
  }
}

But, my store.select returning instantly and not waiting ten seconds, why?但是,我的 store.select 立即返回并且没有等待十秒钟,为什么?

When used promise:使用 promise 时:

 export class CanActivateLoginedInforamtion implements CanActivate { constructor(private store: Store<AppState>) {} canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot ): Promise<boolean>{ return new Promise((resolve) => { this.store.select(({ user: { loginState }}) => { console.log(loginState); resolve(loginState === 'LOGINED'); }) }) } }

This is the observable equivalent to your promise based example:这是基于 promise 的示例的可观察等效项:

export class CanActivateLoginedInforamtion implements CanActivate {
  constructor(private store: Store<AppState>) {}

  canActivate(route: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot
  ): Observable<boolean> {
    return this.isLoggedIn();
  }

  private isLoggedIn(): Observable<boolean> {
    return this.store.select(({ user: { loginState }}) => {          
      return loginState === 'LOGINED';
    });
  }
}

this.store.select() is returning Observable<boolean> , so you can simply return that from canActivate . this.store.select()正在返回Observable<boolean> ,因此您可以简单地从canActivate返回它。 I have moved the store query to a new function to hopefully make it a little clearer.我已将商店查询移至新的 function 以希望使其更清晰一些。

If, for some reason, you want to wait 10 seconds before making the call, you can query your store after timer has elapsed using switchMap in the pipe.如果出于某种原因,您想在拨打电话前等待 10 秒,您可以在timer经过后使用switchMap中的 switchMap 查询您的商店。 This is equivalent to chaining promises.这相当于链接承诺。

You will also need to use take(1) to limit the number of timer events you want to receive.您还需要使用take(1)来限制要接收的计时器事件的数量。

export class CanActivateLoginedInforamtion implements CanActivate {
  constructor(private store: Store<AppState>) {}

  canActivate(route: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot
  ): Observable<boolean> {
    return timer(10000).pipe(
      take(1),
      switchMap(() => this.isLoggedIn())
    );
  }

  private isLoggedIn(): Observable<boolean> {
    return this.store.select(({ user: { loginState }}) => {          
      return loginState === 'LOGINED';
    });
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM