我有一个带有2个菜单项的应用程序;球队,球员.每当我在它们之间切换时,我必须调用不必要的api,即使我存储了数据.

下面是效果文件:

loadTeams$ = createEffect(() => {
    return this.actions$.pipe(
      ofType(AuthActions.loadTeams),
      switchMap((action) =>
        this.apiService.teams$.pipe(
          tap(() => console.log('get teams request')),
          map((teams: Team[]) => AuthActions.loadTeamsSuccess({ teams })),
          catchError((error) => {
            console.log('err', error);
            return of(AuthActions.loadFailure({ error }));
          })
        )
      )
    );
  });

下面是我调用api的组件

团队名单.组成部分ts

export class TeamsListComponent implements OnInit {
  loading$?: Observable<boolean>;
  error$?: Observable<string>;
  teams$?: Observable<Team[]>;
  retrySubject$ = new BehaviorSubject<boolean>(true);

  constructor(private store: Store<State>) {}

  ngOnInit(): void {
    this.store.dispatch(loadTeams());
    this.teams$ = this.store.select(getTeams);
    this.error$ = this.store.select(getError);
    this.loading$ = this.store.select(getLoading);
  }

  fetchRetry() {
    this.retrySubject$.next(false);
  }
}

ngOnInit中的这一行会导致不必要的api调用.this.teams$ = this.store.select(getTeams);

如何防止它在初始化应用程序时进行一次api调用?

推荐答案

loadTeams$ = createEffect(() => {
    return this.actions$.pipe(
      ofType(AuthActions.loadTeams),
      // read the actions$ for an load success event
      withLatestFrom(this.actions$.pipe(ofType(AuthActions.loadTeamsSuccess)),
      // no success event? no teams loaded, so go on
      filter(([loadTeamsAction, loadTeamsSuccessAction]) => !loadTeamsSuccessAction),
      // remove unnecessary action
      map(([loadTeams,]) => loadTeams),
      switchMap((action) =>
        this.apiService.teams$.pipe(
          tap(() => console.log('get teams request')),
          map((teams: Team[]) => AuthActions.loadTeamsSuccess({ teams })),
          catchError((error) => {
            console.log('err', error);
            return of(AuthActions.loadFailure({ error }));
          })
        )
      )
    );
  });

Typescript相关问答推荐

如何在不使用变量的情况下静态判断运算式的类型?

有没有一种方法可以在保持类型的可选状态的同时更改类型?

类型{...}的TypeScript参数不能赋给类型为never的参数''

类型脚本强制泛型类型安全

在使用Typescribe时,是否有一种方法可以推断映射类型的键?

使Typescribe强制所有对象具有相同的 struct ,从两个选项

未在DIST中正确编译TypeScrip src模块导入

Next.js错误:不变:页面未生成

访问继承接口的属性时在html中出错.角形

如何使默认导出与CommonJS兼容

如何使我的函数专门针对联合标记?

有没有可能为这样的函数写一个类型?

vue-tsc失败,错误引用项目可能无法禁用vue项目上的emit

在Mac和Windows上运行的Web应用程序出现这种对齐差异的原因是什么?(ReactNative)

使用条件类型的类型保护

是否有可能避免此泛型函数体中的类型断言?

打字错误推断

在REACT查询中获取未定义的isLoading态

在ts中获取级联子K类型?

为什么 Typescript 无法正确推断数组元素的类型?