Можно ли одновременно прослушивать изменение состояния и действие с помощью прослушивателя набора инструментов reduxMiddleware?

Мне нужно запустить одну и ту же функцию два раза. Один раз после изменения определенного состояния редукции и один раз после выполнения действия редукции. В настоящее время я использую для этого два отдельных слушателя. Мне было интересно, можно ли объединить predicate и actionCreator в один прослушиватель. Я попробовал, но не смог заставить это работать.

Документация по промежуточному программному обеспечению прослушивателя для справки: https://redux-toolkit.js.org/api/createListenerMiddleware

Текущая реализация (работает нормально):

export const addTemperatureAlertListener2 = (
  startListening: AppStartListening
) => {
  startListening({
    predicate: (action, currentState, originalState) => {
      return (
        currentState.chart.yLimits.yMax !== originalState.chart.yLimits.yMax ||
        currentState.chart.yLimits.yMin !== originalState.chart.yLimits.yMin ||
        currentState.user.tConfig.alertHigherThreshold !==
          originalState.user.tConfig.alertHigherThreshold
      );
    },
    effect: (action, listenerApi) => {
      temperatureAlertEffect(action, listenerApi);
    },
  });
};

export const addTemperatureAlertListener1 = (
  startListening: AppStartListening
) => {
  startListening({
    actionCreator: createPatchRecord.fulfilled,
    effect: (action, listenerApi) => {
      temperatureAlertEffect(action, listenerApi);
    },
  });
};

Что я пробовал, но не получилось:

export const addTemperatureAlertListener = (
  startListening: AppStartListening
) => {
  startListening({
    actionCreator: createPatchRecord.fulfilled,
    predicate: (action, currentState, originalState) => {
      return (
        currentState.chart.yLimits.yMax !== originalState.chart.yLimits.yMax ||
        currentState.chart.yLimits.yMin !== originalState.chart.yLimits.yMin ||
        currentState.user.tConfig.alertHigherThreshold !==
          originalState.user.tConfig.alertHigherThreshold
      );
    },
    effect: (action, listenerApi) => {
      temperatureAlertEffect(action, listenerApi);
    },
  });
};

1
52
1

Ответ:

Решено

Мне было интересно, можно ли объединить «предикат» и «actionCreator» в один прослушиватель.

Нет, вы не можете объединить слушателей. Подробности смотрите в startListening.

Вы должны предоставить ровно один из четырех вариантов решения, когда будет запускаться прослушиватель: type, actionCreator, matcher или predicate.

Это означает, что каждое промежуточное ПО прослушивателя может выбрать только одно из вышеперечисленного и обратный вызов effect.

Что вы могли бы сделать, так это «частично» объединить их, то есть одну функцию, которая создает экземпляры обоих прослушивателей.

export const addTemperatureAlertListener = (
  startListening: AppStartListening
) => {
  startListening({
    predicate: (action, currentState, originalState) => {
      return (
        currentState.chart.yLimits.yMax !== originalState.chart.yLimits.yMax ||
        currentState.chart.yLimits.yMin !== originalState.chart.yLimits.yMin ||
        currentState.user.tConfig.alertHigherThreshold !==
          originalState.user.tConfig.alertHigherThreshold
      );
    },
    effect: temperatureAlertEffect,
  });

  startListening({
    actionCreator: createPatchRecord.fulfilled,
    effect: temperatureAlertEffect,
  });
};