Angular 角度7防护-最佳实践

Angular 角度7防护-最佳实践,angular,rxjs,ngrx,Angular,Rxjs,Ngrx,我需要帮助来改进我的Angular 7 Guard代码。 我认为先订阅当前用户,然后在switchMap上使用它不是一个好的做法。首先,感谢您的帮助 从“@angular/core”导入{Injectable}; 从“@angular/router”导入{CanActivate}; 从'@app/core/models/User/User'导入{User}; 从'@ngrx/Store'导入{select,Store}; 从“@redux/app.reducers”以root格式导入*; 从“@

我需要帮助来改进我的Angular 7 Guard代码。 我认为先订阅当前用户,然后在switchMap上使用它不是一个好的做法。首先,感谢您的帮助

从“@angular/core”导入{Injectable}; 从“@angular/router”导入{CanActivate}; 从'@app/core/models/User/User'导入{User}; 从'@ngrx/Store'导入{select,Store}; 从“@redux/app.reducers”以root格式导入*; 从“@redux/payment/subscription/invoice/invoice.actions”导入*作为发票操作; 从“@redux/payment/subscription/subscription.reducer”导入*作为订阅; 从“@redux/user/user.reducers”导入*作为fromUser; 从'rxjs'导入{可观察的}; 从“rxjs/operators”导入{filter,switchMap,take,tap}; @注射的 导出类LoadSubscriptionInvoicesGuard实现CanActivate{ 构造器私有存储:存储{ } getFromAPIuser:用户:可观察{ 归还这个.store.pipe selectfromSubscription.selectInvoiceLoaded, tapload:boolean=>{ 如果!已加载{ this.store.dispatchnew invoiceActions.LoadCollectionuser; } }, filterloaded:boolean=>loaded, take1; } 可激活的:可观察的{ 让用户:用户; this.store.pipeselectfromUser.selectCurrentUser, take1 .subscribe\u user:user=>user=\u user; 返回此.getFromAPIuser.pipe switchMap=>oftrue; } }
这是一个不错的做法,但您的代码并不是最好的

  canActivate(): Observable<boolean> {
    return this.store.pipe(
      select(fromUser.selectCurrentUser),
      switchMap(user => this.getFromAPI(user)),
      map(value => !!value),
      take(1),
    );
  }

尝试避免分离的可观察对象:它们首先是异步操作,这意味着第二个可观察对象的结果可能在给定时间发生变化。通过这样的链接,你可以防止这些副作用的发生

这不是一个坏习惯,但您的代码并不是最好的

  canActivate(): Observable<boolean> {
    return this.store.pipe(
      select(fromUser.selectCurrentUser),
      switchMap(user => this.getFromAPI(user)),
      map(value => !!value),
      take(1),
    );
  }

尝试避免分离的可观察对象:它们首先是异步操作,这意味着第二个可观察对象的结果可能在给定时间发生变化。通过这样的链接,你可以防止这些副作用的发生

检查此博客以了解的最佳做法。检查此博客以了解的最佳做法。