Понимание 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())
                     )
    }

Это, в свою очередь, приводит к тому, что эффект не срабатывает. При чтении кода это выглядит так:

  1. Когда вы видите эти действия
  2. запустить эффекты
  3. пока вы не увидите это другое действие.

Что я делаю неправильно?

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

Другие вопросы по тегам