promiseReducer.js 845 B

12345678910111213141516171819202122232425262728
  1. export function promiseReducer(state = {}, { type, status, payload, error, name }) {
  2. if (type === 'PROMISE') {
  3. return {
  4. ...state,
  5. [name]: { status, payload, error }
  6. }
  7. }
  8. return state;
  9. }
  10. const actionPending = name => ({ type: 'PROMISE', status: 'PENDING', name })
  11. const actionResolved = (name, payload) => ({ type: 'PROMISE', status: 'RESOLVED', name, payload })
  12. const actionRejected = (name, error) => ({ type: 'PROMISE', status: 'REJECTED', name, error })
  13. export const actionPromise = (name, promise) =>
  14. async dispatch => {
  15. dispatch(actionPending(name))
  16. try {
  17. let data = await promise
  18. dispatch(actionResolved(name, data))
  19. return data
  20. }
  21. catch (error) {
  22. dispatch(actionRejected(name, error))
  23. }
  24. }