Перехват всех действий, отправленных в магазин NgRx

#action #ngrx #store

Вопрос:

Я новичок в NgRx. Я сделал какой-то код, но результат не совсем такой, как предполагалось. Я хотел бы перехватывать каждое действие, отправляемое с dispatch() помощью функции в магазин.

Мои цели заключаются в следующем:

  1. перехватывайте каждое действие, отправляемое в магазин, в пользовательском эффекте и распечатывайте текст (Перехватывающее действие…) на консоли без изменения действия. (Эффект, который обрабатывает это действие, должен работать нормально.)
  2. если действие (которое ранее было отправлено в магазин) выполнило свою работу (т. Е. Соответствующий редуктор внес изменения в магазин), я также хочу «отреагировать» на это и распечатать другое сообщение (Получено состояние из магазина.) на консоли.

У меня есть 2 проблемы в моем коде:

  1. тексты отображаются в неправильном порядке (т. Е. Сначала «Получено состояние из хранилища», затем «Перехватывающее действие…», затем снова «Получено состояние из хранилища»).
  2. чтобы перехватить каждое действие, я создаю массив всех действий, определенных в приложении, и вызываю ofType() этот массив. Если будет реализовано новое действие, мне придется вручную обновить этот массив. Есть ли способ получить зарегистрированные действия непосредственно из магазина ?

Ниже приведен код:

приложение.модуль.ts

 //to register the Effect to intercept the actions imports: [ EffectsModule.forRoot([InterceptorEffects]), ]  

приложение.компонент.ts

 //here I react to the changes of the store _interceptorSubscription: Subscription; this._interceptorSubscription = _store.pipe(select((state, props) =gt; console.log("Got state from store.")) );  

перехватчик.эффект.ts

 //the Effect that should intercept every action @Injectable({ providedIn: "root" }) export class InterceptorEffects {  private readonly _interceptAllAction$ = createEffect(() =gt;  this._actions.pipe(  ofType(...[JobActions.downloadResultAction, JobActions.deleteJobAction]),  tap(() =gt; console.log("Intercepting action..."))  )  , { dispatch: false } );   constructor(private _actions: Actions) {} }  

Спасибо вам за любой совет.

Ответ №1:

Могу я спросить, зачем вам это нужно? Чтобы ответить на вопрос:

  1. АФАИК, ты не можешь этого сделать. Действие сначала достигает всех редукторов, а затем обрабатывается эффектами. Если вы хотите зарегистрировать действия ДО того, как они достигнут редуктора, взгляните на мета-редукторы.
  2. Чтобы реагировать на все действия в эффекте, не используйте ofType оператора, а просто подпишитесь на поток действий.

Комментарии:

1. Спасибо за подсказку. Я пытаюсь управлять пользовательской панелью загрузки; т. Е. (Начало действия)-gt;(Показать панель) соответственно. (Завершение действия)-gt;(Скрытая панель). Не все действия выполняют http-запрос. Должен ли я проверить состояние магазина, чтобы выполнить это ? Вы позволите мне задать еще 2 вопроса ?: 1) «…действия сначала достигают редукторов…»: означает ли это включение() соответствующего. запускается редуктор И вычисляется каждое соответствующее утверждение «выбрать (…)»? 2) в заявлении «createEffect(() =gt; this._actions.pipe(OfType(someAction), share()), { dispatch: false });» : какова цель указания как «поделиться ()», так и «отправить» ?

2. 1) да 2) вам не нужно делиться, отправлять, чтобы действие не отправлялось в магазин

3. Спасибо за ваш ответ.