ROOT_EFFECTS_INIT никогда не вызывается

#angular #rxjs #ngrx #ngrx-effects

#angular #rxjs #ngrx #ngrx-эффекты

Вопрос:

У меня есть эффект в 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,
    ...
  ]

 

Почему это событие никогда не отправляется? это потому, что я использую хранилище маршрутизаторов?

Ответ №1:

Проблема в

 of().pipe(withLatestFrom)
 

Пустой of() никогда не будет генерировать событие, поэтому withLatestFrom он также не может генерировать.

Вся строка может быть упрощена до одной switchMapTo ( concatMap опасно в случае 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) чего-нибудь (зависит от того, чего вы хотите достичь) в канал (ы), чтобы у вас был полный контроль над происходящим.