Используя эффекты Ngrx, жизненный цикл зацепляет эффекты OnInitEffects (кажется, излучает бесконечно)

#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. Боже мой, не могу поверить, что я это пропустил.