NgRx отписаться от магазина в эффектах

У меня простой эффект:

@Effect()
simpleEffect = this.actions.pipe(
  ofType<ActionA>('Action A'),
  withLatestFrom(this.store.select(selectSomething)),
  map(([action, something]) => console.log('CALLED TWICE'))
);

Вот селектор:

export const selectSomething = createSelector(
  (appState) => appState.someState,
  (someState) => someState.something
)

Ниже приведен простой редьюсер, который обновляет значение something:


export const someReducer = (state: SomeState = someInitialState, action: ActionB) => {
  switch (action.type) {
    case 'Action B':
      return {
        ...state,
        something: action.payload
      };
    default:
      return state;
  }
};

Эта проблема:

Когда я отправляю ActionB, вызывается эффект для ActionA, несмотря на то, что это не так.

Как я выяснил, это происходит из-за withLatestFrom(this.store.select(selectSomething)) в эффекте, который следит за любыми изменениями something НАВСЕГДА.

Вопрос:

Можно ли отписаться от этого селектора? Или вместо withLatestFrom есть другая функция?


person Vlad Yurevich    schedule 09.11.2020    source источник


Ответы (2)


Проблема не в коде, который вы показали, потому что withLatestFrom выдает только одно событие. Установите Redux DevTools, чтобы увидеть, какие действия вы отправляете, и узнать, не выполняете ли вы их. не отправлять «Действие А» дважды

person Chris    schedule 09.11.2020
comment
Спасибо за Ваш ответ! - person Vlad Yurevich; 10.11.2020

Проблема была похожей, но не такой.

Честно говоря, у меня был другой эффект для ActionC:

@Effect
otherEffect = this.actions.pipe(
  ofType<ActionC>('Action C'),
  switchMap(() => this.store.select(selectSomethingElse)),
  switchMap(() => of(new ActionA()))
)

И он вызывается, когда somethingElse был изменен.

Я не отправлял ActionA намеренно, но simpleEffect было вызвано otherEffect, подписавшимся на selectSomethingElse

person Vlad Yurevich    schedule 10.11.2020