diff --git a/package.json b/package.json index d12b9ba..7ac7bcb 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ }, "homepage": "http://redux.js.org", "dependencies": { + "change-emitter": "^0.1.2", "lodash": "^4.2.1", "lodash-es": "^4.2.1", "loose-envify": "^1.1.0", diff --git a/src/createStore.js b/src/createStore.js index 0c59bb0..4b11ba6 100644 --- a/src/createStore.js +++ b/src/createStore.js @@ -1,5 +1,6 @@ import isPlainObject from 'lodash/isPlainObject' import $$observable from 'symbol-observable' +import { createChangeEmitter } from 'change-emitter' /** * These are private action types reserved by Redux. @@ -56,15 +57,8 @@ export default function createStore(reducer, initialState, enhancer) { var currentReducer = reducer var currentState = initialState - var currentListeners = [] - var nextListeners = currentListeners var isDispatching = false - - function ensureCanMutateNextListeners() { - if (nextListeners === currentListeners) { - nextListeners = currentListeners.slice() - } - } + var emitter = createChangeEmitter() /** * Reads the state tree managed by the store. @@ -99,26 +93,7 @@ export default function createStore(reducer, initialState, enhancer) { * @returns {Function} A function to remove this change listener. */ function subscribe(listener) { - if (typeof listener !== 'function') { - throw new Error('Expected listener to be a function.') - } - - var isSubscribed = true - - ensureCanMutateNextListeners() - nextListeners.push(listener) - - return function unsubscribe() { - if (!isSubscribed) { - return - } - - isSubscribed = false - - ensureCanMutateNextListeners() - var index = nextListeners.indexOf(listener) - nextListeners.splice(index, 1) - } + return emitter.listen(listener) } /** @@ -172,10 +147,7 @@ export default function createStore(reducer, initialState, enhancer) { isDispatching = false } - var listeners = currentListeners = nextListeners - for (var i = 0; i < listeners.length; i++) { - listeners[i]() - } + emitter.emit() return action }