#ngrx #effects
#ngrx #эффекты
Вопрос:
Я пытаюсь немного узнать о перехватах жизненного цикла эффектов, представленных в Ngrx 7, и я не совсем понимаю, что происходит. У меня есть приложение Angular, и у меня есть следующее в классе эффектов, однако init $ observable выдает значения бесконечно. Я бы ожидал, что он сработает один раз и завершится. Я также несколько новичок в наблюдаемых. Документация мне не очень помогает, поскольку примеров на самом деле не так много. Я мог бы добавить take (1), но я хотел бы понять, почему он продолжает излучать вечно.
@Injectable()
export class AuthEffects implements OnInitEffects{
constructor(private actions$: Actions) {}
@Effect({dispatch: false})
login$ = this.actions$.pipe(
ofType<LoginAction>(AuthActionTypes.LoginAction),
tap(console.log)
);
@Effect({dispatch: false})
logout$ = this.actions$.pipe(
ofType<LogoutAction>(AuthActionTypes.LogoutAction),
tap(console.log)
);
@Effect()
init$ = this.actions$.pipe(
ofType<Action>('[Auth] Effects Init'),
tap(console.log)
);
ngrxOnInitEffects(): Action {
console.log('AuthEffects init'd');
return { type: '[Auth] Effects Init'};
}
}
Ответ №1:
Это ожидаемое поведение — основное использование эффектов заключается в том, чтобы воздействовать на некоторые сторонние побочные эффекты. И вы устанавливаете ofType<Action>
так, чтобы он выполнялся всякий раз, когда происходит какое-либо действие, в то время как, например:
@Effect({dispatch: false})
login$ = this.actions$.pipe(
ofType<LoginAction>(AuthActionTypes.LoginAction),
tap(console.log)
);
генерируется всякий раз, когда происходит loginAction.
Комментарии:
1. Это я понимаю. Но тот, о котором я говорю, — это init $ . Если я запускаю свое приложение angular, консоль постоянно регистрирует init $ effect. Логин выдается только тогда, когда действие входа отправляется, как ожидалось.
2. Потому что нет
{dispatch: false}
, как и в других действиях. Эффекты отправляют действия по умолчанию, если вы не добавляете{dispatch: false}
, а вашеinit
вызывается при любом действии, поэтому, поскольку оно вызывается в первый раз, создается бесконечный цикл — оно отправляет действие и снова воздействует на него3. Боже мой, не могу поверить, что я это пропустил.