Skip to content

Commit c031c0a

Browse files
committed
Delay copying listeners until is necessary
We can avoid excessive slice() calls by only copying the listeners if they are modified during dispatch()
1 parent 24aade4 commit c031c0a

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

src/createStore.js

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,16 @@ export default function createStore(reducer, initialState, enhancer) {
5555

5656
var currentReducer = reducer
5757
var currentState = initialState
58-
var listeners = []
58+
var currentListeners = []
59+
var nextListeners = currentListeners
5960
var isDispatching = false
6061

62+
function beforeMutatingListeners() {
63+
if (nextListeners === currentListeners) {
64+
nextListeners = currentListeners.slice()
65+
}
66+
}
67+
6168
/**
6269
* Reads the state tree managed by the store.
6370
*
@@ -95,17 +102,21 @@ export default function createStore(reducer, initialState, enhancer) {
95102
throw new Error('Expected listener to be a function.')
96103
}
97104

98-
listeners.push(listener)
99105
var isSubscribed = true
100106

107+
beforeMutatingListeners()
108+
nextListeners.push(listener)
109+
101110
return function unsubscribe() {
102111
if (!isSubscribed) {
103112
return
104113
}
105114

106115
isSubscribed = false
107-
var index = listeners.indexOf(listener)
108-
listeners.splice(index, 1)
116+
117+
beforeMutatingListeners()
118+
var index = nextListeners.indexOf(listener)
119+
nextListeners.splice(index, 1)
109120
}
110121
}
111122

@@ -160,9 +171,9 @@ export default function createStore(reducer, initialState, enhancer) {
160171
isDispatching = false
161172
}
162173

163-
var currentListeners = listeners.slice()
164-
for (var i = 0; i < currentListeners.length; i++) {
165-
currentListeners[i]()
174+
var listeners = currentListeners = nextListeners
175+
for (var i = 0; i < listeners.length; i++) {
176+
listeners[i]()
166177
}
167178

168179
return action

0 commit comments

Comments
 (0)