首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CanActivate等待和从商店获取

CanActivate等待和从商店获取
EN

Stack Overflow用户
提问于 2020-04-06 14:45:18
回答 1查看 69关注 0票数 0

我的类中有next方法,它从CanActivate实现:

代码语言:javascript
复制
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' 
      })
    );
  }
}

但是,我的store.select立即返回,而不是等待10秒,为什么?

使用promise时:

代码语言:javascript
复制
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');
      })
    })
  }
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-06 15:10:48

这是与您的基于promise的示例等效的可观察性:

代码语言:javascript
复制
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()将返回Observable<boolean>,因此您可以简单地从canActivate返回它。我已经将商店查询移到了一个新函数中,希望能让它更清晰一些。

如果出于某种原因,您希望在进行调用之前等待10秒,则可以在管道中使用switchMaptimer过期之后查询您的存储。这相当于将承诺链接在一起。

您还需要使用take(1)来限制您想要接收的计时器事件的数量。

代码语言:javascript
复制
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';
    });
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61054308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档