首页 > 解决方案 > NGRX Effect 不过滤操作/管道内的功能被执行

问题描述

我有一个效果,但是在它里面的第一个 switchMap 之后的 mergeMap 被触发而不触发 GetPackageCalendar 类型的动作

@Effect()
  loadCalendar$ = this.actions$
    .pipe(
      ofType(fromActions.GetPackageCalendar),
      switchMap(() => this.store.select(selectRouterState)),
      mergeMap(
        (state: RouterStateUrl) => this.store.select(selectCalendarParams).pipe(
          switchMap((calParams) => this.getPackageCalendar(state, calParams)),
          //this gets executed
        ),
      ),
      map((calendar: CalendarRS) => new fromActions.SetPackageCalendar(calendar)),
    );

`

怎么了?

我想从商店中选择两个值并将它们作为参数传递给getPackageCalendar

标签: angularrxjsngrx

解决方案


我的猜测是因为store select你的第一个部分 switchMap。它继续订阅GetPackageCalendarafter first call。在这种情况下,您只想选择一次存储值。所以在执行后包括一个take(1)自动取消订阅。

@Effect()
loadCalendar$ = this.actions$
  .pipe(
    ofType(fromActions.GetPackageCalendar),
    switchMap(() => {
      // take one only
      const obs$ = this.store.select(selectRouterState).pipe(take(1));
      return obs$;
    }),
    ...
  );

推荐阅读