Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Redux Middleware for async actions

npm version npm downloads Standard - JavaScript Style Guide

  • FSA
  • Promise based

Usage example

  • Actions creators
const githubFetching = createAction(GITHUB_FETCHING)
const githubError    = createAction(GITHUB_ERROR)
const githubSuccess  = createAction(GITHUB_SUCCESS)
  • Create an action passing all action creators and the api call method
export const getUserFromGithub = username => ({
  type : [
    githubFetching,
    githubSuccess,
    githubError
  ],
  payload : {
    data : () => axios.get(`https://api.github.com/users/${username}`)
  }
})
  • type is an Array with actions creators
  • payload must have data property and it must to be a function that returns a Promise

Note: you can pass more properties inside payload and it will be passed to success action.

Basic flow: loginSending -> data -> loginSuccess / loginError

The middleware will call loginSending before apiCall and loginSuccess when promise got resolved, if got an error, loginError will be called.

Reducer / Action creators example (with redux-actions)

  • Actions types
export const GITHUB_FETCHING = 'modules/Github/FETCHING'
export const GITHUB_SUCCESS  = 'modules/Github/SUCCESS'
export const GITHUB_ERROR    = 'modules/Github/ERROR'
  • Reducer
import {handleActions} from 'redux-actions'

import {GITHUB_FETCHING, GITHUB_SUCCESS, GITHUB_ERROR} from './actions'

const initialState = {
  fetching : false,
  user     : null
}

const reducer = handleActions({
  [GITHUB_FETCHING]: (state, action) => ({
    ...state,
    sending     : true
  }),

  [GITHUB_SUCCESS]: (state, action) => ({
    sending     : false,
    user        : action.payload.data
  }),

  [GITHUB_ERROR]: (state, action) => ({
    ...state,
    sending     : false,
  })

}, initialState);

export default reducer

Example without redux-actions

const githubFetching = () => ({ type : 'GITHUB_FETCHING' })
const githubError    = () => ({ type : 'GITHUB_ERROR' })
const githubSuccess  = payload => ({
  type    : 'GITHUB_SUCCESS',
  payload : payload
})

const initialState = {
  fetching : false,
  user     : null
}

export const getUserFromGithub = username => ({
  type : [
    githubFetching,
    githubSuccess,
    githubError
  ],
  payload : {
      data : () => axios.get(`https://api.github.com/users/${username}`)
  }
})

export default (state = initialState, action) => {
  switch (action.type) {
    case 'GITHUB_FETCHING':
      return {...state,
              fetching     : true
              }
    case 'GITHUB_SUCCESS':
      return {...state,
              fetching     : false,
              user         : action.payload.data
              }
    case 'GITHUB_ERROR':
      return {...state,
              fetching       : false
            }
    default:
      return state
  }
}

Another Note: You have to pass the default methods to dispatch in case of success or failure, but the middleware will always return a Promise. So if you need to do something after dispatch these methods, you are able to use:

dispatch(myAction())
// here we got the dispatch of success or failure and then...
.then()
.catch()
// and so on

About

Redux Middleware for async actions (side-effects)

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages