ROOT_EFFECTS_INIT 从未被调用

ROOT_EFFECTS_INIT is never called

我在 ngrx 中有一个效果叫做 SelfEffect

我希望它在加载时执行以下操作:

  @Effect()
  init$ = this.actions$.pipe(
    ofType(ROOT_EFFECTS_INIT),
    concatMap(() => of().pipe(withLatestFrom(this.store.pipe(select(IsAuthenticated))))),
    switchMap(([_, isLogged]) => (isLogged ? of(new GetSelfRequest()) : EMPTY))
  );

现在,此效果已在 app.store.module

中注册
@NgModule({
  imports: [
    StoreModule.forRoot(appReducers, { metaReducers }),
    EffectsModule.forRoot([AuthEffects, AlertEffects, SelfEffects]),
    StoreRouterConnectingModule.forRoot({
      serializer: RouterSerializer,
      navigationActionTiming: NavigationActionTiming.PostActivation,
    }),
    StoreDevtoolsModule.instrument({
      name: 'Dev'
     }),
  ],
  providers: [Store],
})

app.module.ts

中调用
@NgModule({
  imports: [
    AppRoutingModule,
    AppStoreModule,
    ...
  ]

为什么这个事件从不调度?是因为我使用路由器商店吗?

问题出在

of().pipe(withLatestFrom)

of() 永远不会发出事件,因此 withLatestFrom 也不能发出。

整行可以简化为单个 switchMapToconcatMap 是危险的,因为 ROOT_EFFECTS_INIT 可能触发更多次 - 每次都会增加动作)。

  @Effect()
  init$ = this.actions$.pipe(
    ofType(ROOT_EFFECTS_INIT),
    switchMapTo(this.store.pipe(select(IsAuthenticated))),
    switchMap((isLogged) => (isLogged ? of(new GetSelfRequest()) : EMPTY))
  );

PS:我会考虑将 take(1) 添加到管道中的某处(取决于您想要实现的目标),以便您可以完全控制正在发生的事情。