es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for 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 con newState 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:

    export const withResetState = (resetStateActionType, initialState) => (baseReducer) => {
      return (state, action) => {
        const newState = action.type === resetStateActionType ? { ...initialState } : state;
        return baseReducer(newState, action);
      };
    };
    

    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!

Comments are closed.