首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Angular 7 Guard -最佳实践

Angular 7 Guard -最佳实践
EN

Stack Overflow用户
提问于 2019-06-21 20:04:45
回答 1查看 507关注 0票数 0

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

代码语言:javascript
运行
复制
import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
import { User } from '@app/core/models/user/user';
import { select, Store } from '@ngrx/store';
import * as fromRoot from '@redux/app.reducers';
import * as invoiceActions from '@redux/payment/subscription/invoice/invoice.actions';
import * as fromSubscription from '@redux/payment/subscription/subscription.reducer';
import * as fromUser from '@redux/user/user.reducers';
import { Observable, of } from 'rxjs';
import { filter, switchMap, take, tap } from 'rxjs/operators';

@Injectable()
export class LoadSubscriptionInvoicesGuard implements CanActivate {
  constructor(private store: Store<fromRoot.AppState>) {
  }

  getFromAPI(user: User): Observable<any> {
    return this.store.pipe(
      select(fromSubscription.selectInvoiceLoaded),
      tap((loaded: boolean) => {
        if (!loaded) {
          this.store.dispatch(new invoiceActions.LoadCollection(user));
        }
      }),
      filter((loaded: boolean) => loaded),
      take(1));
  }

  canActivate(): Observable<boolean> {
    let user : User;
    this.store.pipe(select(fromUser.selectCurrentUser),
    take(1))
    .subscribe((_user: User) => user = _user);

    return this.getFromAPI(user).pipe(
      switchMap(() => of(true)));
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-21 20:08:45

这不是一个糟糕的实践,但您的代码并不是最好的。

代码语言:javascript
运行
复制
  canActivate(): Observable<boolean> {
    return this.store.pipe(
      select(fromUser.selectCurrentUser),
      switchMap(user => this.getFromAPI(user)),
      map(value => !!value),
      take(1),
    );
  }

尽量避免分离的可观察对象:它们一开始就是异步操作,这意味着第二个可观察对象的结果可能在给定的时间发生变化。通过像这样链接它们,您可以防止这些副作用的发生。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56703123

复制
相关文章

相似问题

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