redux-pure-fetch
v0.0.4
Published
A declarative Redux middleware to manage asynchronous service calls and side-effects, so the reduc action creator & reducer stay pure can stay pure and actions still serializable
Downloads
1
Maintainers
Readme
redux-pure-fetch
A declarative Redux middleware to manage asynchronous service calls and side-effects. Using browser fetch API internally but dispatch FSA actions, returns promises for optional promise orchestration
Design Goal
- promise unaware, (unless desired, which follows standard promise coordination pattern)
- declarative side effect
- stay within Redux action => reducer pattern
- manage side-effect as separate response handlers so client code stay functional
- service request and response fires 2 separate actions so redux ticks twice (vs. once in redux-thunk which makes replay harder?)
- testing concerns are addressed through dependency management (aiming for simple middleware swap or declarative response mocking)
Non-goal
- Abstract AJAX as a type of datasource, like local cache is not in scope. Rather, the library aims to allow easily wrapping to achieve that.
- Move application logic in middleware. Fetch clients's responsibility only extends to managing connections.
- Callback hell. Use more powerful libraries like Redux-epic solves that. Though this library intended to limit it's power to be more focused on asynchronous calls, it still returns a promise so regular promise orchestration would work and is up to the user. (Plus, callback is supposed to be less of a problem in Redux anyway.)
Design choices
- Not forcing dispatch on response: reducer can omit the dispatched undefined action
- Sequential AJAX calls are supported by dispatching new actions in success/error handler.
- Advanced promise coordination is not supported due to the declarative API design, until declarative coordination standard become available.
- Accept extended FSA actions (with all serializable information within standard fields), and dispatch FSA actions for upstream/downstream middleware processing).
- TODO: should work with FETCH or Service Worker API standard.
Inspired by
- Discussions with Luke
- https://goshakkk.name/redux-side-effect-approaches/
- https://medium.com/javascript-and-opinions/redux-side-effects-and-you-66f2e0842fc3
- http://blog.isquaredsoftware.com/2017/01/idiomatic-redux-thoughts-on-thunks-sagas-abstraction-and-reusability/
- Concluding thought, the best practise of using redux, is as if it doesn't exist... Redux is not to help app developing, it's more of an elegant log system.