Понимание Ngrx OnRunEffects
У меня есть несколько прослушивателей эффектов, которые нужно запустить, пока пользователь не выйдет из системы. Поэтому я пытаюсь реализовать OnRunEffects.
Сегмент моего user.actions.ts:
export const LOAD_USER = '[Users] Load User';
export class LoadUser implements Action {
readonly type = LOAD_USER;
}
export type UserActions = LoadUser;
Я пытаюсь реализовать OnRunEffects как:
ngrxOnRunEffects(resolvedEffects: Observable<EffectNotification>) {
return this.actions
.ofType(UsersActions.LOAD_USER)
.exhaustMap(() => resolvedEffects.takeUntil(AuthActions.LOGOUT_SUCCESS)
}
Тем не менее, takeUntil жалуется, что ему нужно как наблюдаемый. Итак, я попробовал:
ngrxOnRunEffects(resolvedEffects: Observable<EffectNotification>) {
return this.actions
.ofType(UsersActions.LOAD_USER)
.exhaustMap(() => resolvedEffects.takeUntil(
Observable.of(new AuthActions.LogoutSuccess())
)
}
Это, в свою очередь, приводит к тому, что эффект не срабатывает. При чтении кода это выглядит так:
- Когда вы видите эти действия
- запустить эффекты
- пока вы не увидите это другое действие.
Что я делаю неправильно?
2 ответа
Поправьте меня, если я ошибаюсь, но вы можете не захотеть run until the user has logged out
Вы можете просто запустить эти эффекты, если пользователь все еще вошел в систему. Если да, то вместо того, чтобы думать takeUntil
:
@Effect()
someEffect$: Observable<Action> = this.actions$
.ofType<Your_Type>(Your_Action)
.withLatestFrom(this.store$.select(state => state.users.isUserLoggedIn))
.filter(([action, isUserLoggedIn]) => isUserLoggedIn)
// here, you'll receive the actions only is the user is logged in
// ... your code for the effect
Попробуй это:
ngrxOnRunEffects(resolvedEffects: Observable<EffectNotification>) {
return this.actions
.ofType(UsersActions.LOAD_USER)
.exhaustMap(() => resolvedEffects.takeUntil(this.actions.ofType(AuthActions.LOGOUT_SUCCESS)))
}
Документация обновлена: https://github.com/ngrx/platform/commit/4b606d581d18866576b9632b0537953c2b6006c4