Búsqueda de sitios web

javascript - Encadenando acciones de Redux


Soy nuevo en React, Redux y JS en general. Quiero saber cómo puedo despachar una acción después de que otra haya terminado - Promesas de la manera correcta. Mi código funciona actualmente, pero sigue lanzando un error:

readingActions.js?14b9:56 Uncaught (in promise) TypeError: dispatch(...).then is not a function(…)

Esta es mi configuración.

  • Este es mi creador de acciones, lo que quiero es una acción encadenada y donde ocurre la advertencia.

    export function createReading(reading) {
      return function (dispatch) {
        dispatch({type: CREATE_READING});
        return request(
          `${API_URL}new`, {method: 'POST', body:JSON.stringify(reading)},
          (json) => {( dispatch({type: CREATE_READING_SUCCESS, res: json}).then(dispatch(Notifications.success(showSuccess(json.book.title)))))},
          (json) => { dispatch({type: CREATE_READING_ERROR400, res: json}).then(dispatch(Notifications.error(showError(json.error)))) },
          (res) => { dispatch({type: CREATE_READING_ERROR500, res: res}) },
          (ex) => { dispatch({type: CREATE_READING_FAILURE, error: ex}) },
        )
      }
    }
    

Como puedes ver, el problema está en .then, ya que no sé cómo activar la acción correctamente.

  • También puedes ver que la solicitud es mi función auxiliar que se ve así (aquí agrego el token, devuelvo diferentes respuestas):

    export function request(url, options, success, error400, error, failure) {
        let headers = new Headers();
        headers.append("Content-Type", "application/json")
        headers.append("Accept", "application/json")
        options["headers"] = headers;
    
         if (localStorage.jwtToken) {
            let token = localStorage.jwtToken;
            headers.append('Authorization', 'JWT '+token);
         }
    
        return fetch(url, options)
            .then(res => {
                if (res.status >= 200 && res.status < 300) {
                    res.json().then(json => {
                         return success(json)
                    })
                } else if (res.status === 400) {
                    res.json().then(json => {
                        return error400(json)
                    })
                } else {
                    return error(res)
                }
            }).catch((ex) => {
                return failure(ex)
            })
    }
    

La pregunta es cómo puedo ejecutar correctamente .then y cuál sería la manera correcta?

Respuesta #1

Si quieres enviar acciones en cadenas, en realidad puedes implementarlo por tu cuenta.

Ahora, después de analizar un poco, tomas un bolígrafo y papel y comienzas a escribir el algoritmo básico de cómo debería funcionar y llegas a lo siguiente:-

dispatch(action) => action returns function => action returns function => action returns an object(here you chain ends)

Ahora, desde arriba, si ves eso, creas un middleware y sigues despachando acciones que devuelven funciones hasta que obtienes una acción que devuelve un objeto. Esto es lo que hace redux-thunk.

Así que incluso si tratas de crear algo propio, hazlo para tu aprendizaje, pero eventualmente se te ocurrirá algo como thunk o tal vez algún otro paquete.

Realmente diría que pruebes redux-thunk. También, para entender el middleware, te recomendaría que revises la documentación de middleware de redux.