redux-promise-thunk-v1 v0.0.5
redux-promise-thunk-v1
compose redux-promise and redux-thunk,
support promise function and arguments with dispatch and getState();
FSA-compliant promise middleware for Redux.
npm install redux-promise-thunk-v1 --save
Usage
// new
import promiseThunkMiddleware from 'redux-promise-thunk-v1';
const middlewares = [
// new
promiseThunkMiddleware,
];
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const storeEnhancers = composeEnhancers(
applyMiddleware(...middlewares),
);
The default export is a middleware function. If it receives a promise, it will dispatch the resolved value of the promise. It will not dispatch anything if the promise rejects.
If it receives an Flux Standard Action whose payload
is a promise, it will either
- dispatch a copy of the action with the resolved value of the promise, and set
status
tosuccess
. - dispatch a copy of the action with the rejected value of the promise, and set
status
toerror
.
The middleware returns a promise to the caller so that it can wait for the operation to finish before continuing. This is especially useful for server-side rendering. If you find that a promise is not being returned, ensure that all middleware before it in the chain is also returning its next()
call to the caller.
Using in combination with redux-actions
Because it supports FSA actions, you can use redux-promise in combination with redux-actions.
Example: Async action creators
This works just like in Flummox:
createAction('FETCH_THING', async id => {
const result = await somePromise;
return result.someValue;
});
new feature (****)
createAction('FETCH_THING', async id => {
const result = await somePromise;
return (dispatch, getState) => {
dispatch(someData);
dispatch(someData2);
return result.someValue;
};
});
new feature (****)
createAction('FETCH_THING', id => {
return (dispatch, getState) => {
dispatch(someData);
dispatch(someData2);
return result.someValue;
};
});
Unlike Flummox, it will not perform a dispatch at the beginning of the operation, only at the end. We're still looking into the best way to deal with optimistic updates. If you have a suggestion, let me know.
Example: Integrating with a web API module
Say you have an API module that sends requests to a server. This is a common pattern in Flux apps. Assuming your module supports promises, it's really easy to create action creators that wrap around your API:
import { WebAPI } from '../utils/WebAPI';
export const getThing = createAction('GET_THING', WebAPI.getThing);
export const createThing = createAction('POST_THING', WebAPI.createThing);
export const updateThing = createAction('UPDATE_THING', WebAPI.updateThing);
export const deleteThing = createAction('DELETE_THING', WebAPI.deleteThing);
(You'll probably notice how this could be simplified even further using something like lodash's mapValues()
.)