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