reductor de orden superior en un proyecto de React-Redux
Me uní a un proyecto que está escrito en React.js con redux y saga. Los reductores en el store están escritos utilizando la función pipe:
export const HighestOrderReducer = (...higherOrderReducers) => (baseReducer) =>
higherOrderReducers.reduce(
(reducer, nextHigherOrderReducer) => nextHigherOrderReducer(reducer),
baseReducer
);
Entonces, por ejemplo, tengo una función de despacho de una acción:
dispatch(createSocketConnection(token));
que crea una acción con tipo SOCKET_ACTION_TYPES.GET.START y carga útil token.
Así es como se ve el reductor para esta sección:
export default HighestOrderReducer (
withResetState(SOCKET_ACTION_TYPES.RESET_STATE, initialState),
withLoadable({
isLoadingActionType: [SOCKET_ACTION_TYPES.GET.START],
successActionType: [SOCKET_ACTION_TYPES.GET.SUCCESS],
errorActionType: [SOCKET_ACTION_TYPES.GET.ERROR]
})
)(reducer);
que es una función pipe, y se puede reescribir como:
withLoadable({
isLoadingActionType: [SOCKET_ACTION_TYPES.GET.START],
successActionType: [SOCKET_ACTION_TYPES.GET.SUCCESS],
errorActionType: [SOCKET_ACTION_TYPES.GET.ERROR]
})
(withResetState(resetStateActionType, initialState)(reducer)(state, action))
(state, action)
Aquí están las funciones withResetState, withLoadable y reducer:
// la primera función de la tubería
export const withResetState = (resetStateActionType, initialState) => (baseReducer) => (state, action) => {
const newState = action.type === resetStateActionType ? { ...initialState } : state;
return baseReducer(newState, action);
};
Ahora, si observas la función withResetState, con el tipo de acción y el reductor dados, está devolviendo un objeto, initialState. Mi problema es que para que funcione la segunda función de la tubería, withLoadable, se supone que la primera debe devolver algún tipo de función, lo cual no hace según mi conocimiento.
Entonces, ¿podrías por favor decirme si me he perdido algo y la primera función realmente devuelve una función o si encontré un error en el proyecto existente?
davy.ai
Basado en el código que proporcionaste, parece que
withResetState
no está devolviendo una función, sino que está devolviendo el reductor base connewState
pasado directamente como primer argumento. Esto sugeriría que de hecho hay un problema en el código.Para que
withLoadable
funcione según lo pretendido con el pipeline, la función anterior en el pipeline debería devolver una función reductora de orden superior que tome el reductor base y devuelva una nueva función reductora que maneje las acciones correspondientes.Una solución potencial sería modificar la implementación de
withResetState
para devolver una función reductora de orden superior en su lugar:De esta manera, cuando se aplica el pipeline, la primera función devolverá una nueva función reductora que puede ser pasada a la siguiente función en el pipeline.
¡Espero que esto ayude!