redux-thunk-subscribe
Version:
Makes store.subscribe available to Redux thunks
45 lines (28 loc) • 3.16 kB
Markdown
# Redux Thunk Subscribe
[](https://travis-ci.org/tinybike/redux-thunk-subscribe) [](https://coveralls.io/github/tinybike/redux-thunk-subscribe?branch=master) [](https://badge.fury.io/js/redux-thunk-subscribe)
Similar to [Redux Thunk](https://github.com/gaearon/redux-thunk), but with `subscribe` available to thunks (in addition to `dispatch` and `getState`) so they can add listeners to the store on-the-fly.
*Important note: if you just need asynchonous actions, you probably should be using [Redux Thunk](https://github.com/gaearon/redux-thunk) instead!*
## Usage
```
npm install --save redux-thunk-subscribe
```
```javascript
var createStore = require("redux").createStore;
var thunkSubscribeEnhancer = require("redux-thunk-subscribe");
var store = createStore(reducer, thunkSubscribeEnhancer);
var thunkExclamationPoint = function () {
return function (dispatch, getState, subscribe) {
console.log("thunk!");
};
};
store.dispatch(thunkExclamationPoint());
```
## Motivation
Why make `store.subscribe` available to action creators (thunks)?
[Redux](https://github.com/reactjs/redux) is normally used to build UIs, which are "complete" applications in the sense that no code is expected to be supplied by the application's users. In a UI, the consumer of `store.subscribe` can simply be hard-coded (usually to [React](https://github.com/facebook/react)). Library code is different. Often, libraries expect users to supply certain pieces of code; a common example is an event handler where the user specifies a callback function. I like the Redux philosophy a lot, and in my opinion it is a good fit for library code. However, in library code, consumers of `store.subscribe` are not always known in advance, and, in some cases, they are intended to be defined by the library's users. This creates a problem: *where does the library save the callbacks?*
One option is to put the user-created callbacks in the Redux store, along with the other data. However, since the callbacks are not serializable, this [breaks some nice features of Redux](http://redux.js.org/docs/faq/OrganizingState.html#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state). Putting callbacks in the store also just *feels* wrong: the callbacks themselves are not really *state* per se, but rather *observers* of the state.
I think a better solution is to make `store.subscribe` available to action creators, so that they can set up store listeners (i.e., user-supplied callbacks) on-the-fly. That's what this library does. Since `subscribe` is [not included in Redux's middleware API](https://github.com/reactjs/redux/issues/922), this library is a [store enhancer](https://github.com/reactjs/redux/blob/master/docs/Glossary.md#store-enhancer) that changes the thunk signature from `(dispatch, getState)` to `(dispatch, getState, subscribe)`.
## Tests
```
npm test
```