Мне нужно запустить одну и ту же функцию два раза. Один раз после изменения определенного состояния редукции и один раз после выполнения действия редукции. В настоящее время я использую для этого два отдельных слушателя. Мне было интересно, можно ли объединить 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);
},
});
};
Мне было интересно, можно ли объединить «предикат» и «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,
});
};