Commit 1b503e67aebb1a6a8373f20984ff3e6e745ecaa0
cache listeners on broadcast in case listeners change during iteration
Matt McKegg committed on 7/22/2016, 12:27:52 PMParent: 955ee4ba0914a6c2c9a1158bdfa7ea7a186ca900
Files changed
computed.js | changed |
map.js | changed |
value.js | changed |
computed.js | ||
---|---|---|
@@ -130,19 +130,15 @@ | ||
130 | 130 … | |
131 | 131 … | function onInnerUpdate (value) { |
132 | 132 … | if (value !== computedValue || isReferenceType(computedValue)) { |
133 | 133 … | computedValue = value |
134 | - for (var i = 0, len = listeners.length; i < len; i++) { | |
135 | - listeners[i](computedValue) | |
136 | - } | |
134 … | + broadcast(listeners, computedValue) | |
137 | 135 … | } |
138 | 136 … | } |
139 | 137 … | |
140 | 138 … | function onUpdate () { |
141 | 139 … | if (update()) { |
142 | - for (var i = 0, len = listeners.length; i < len; i++) { | |
143 | - listeners[i](computedValue) | |
144 | - } | |
140 … | + broadcast(listeners, computedValue) | |
145 | 141 … | } |
146 | 142 … | } |
147 | 143 … | |
148 | 144 … | function getValue () { |
@@ -156,4 +152,12 @@ | ||
156 | 152 … | |
157 | 153 … | function isReferenceType (value) { |
158 | 154 … | return typeof value === 'object' && value !== null |
159 | 155 … | } |
156 … | + | |
157 … | +function broadcast (listeners, value) { | |
158 … | + // cache listeners in case modified during broadcast | |
159 … | + listeners = listeners.slice(0) | |
160 … | + for (var i = 0, len = listeners.length; i < len; i++) { | |
161 … | + listeners[i](value) | |
162 … | + } | |
163 … | +} |
map.js | ||
---|---|---|
@@ -154,10 +154,11 @@ | ||
154 | 154 … | }) |
155 | 155 … | } |
156 | 156 … | |
157 | 157 … | function broadcast () { |
158 | - for (var i = 0, len = listeners.length; i < len; i++) { | |
159 | - listeners[i](values) | |
158 … | + var cachedListeners = listeners.slice(0) | |
159 … | + for (var i = 0, len = cachedListeners.length; i < len; i++) { | |
160 … | + cachedListeners[i](values) | |
160 | 161 … | } |
161 | 162 … | } |
162 | 163 … | |
163 | 164 … | function getValue () { |
value.js | |||
---|---|---|---|
@@ -6,10 +6,11 @@ | |||
6 | 6 … | ||
7 | 7 … | observable.set = function (v) { | |
8 | 8 … | value = v | |
9 | 9 … | ||
10 | - for (var i = 0, len = listeners.length; i < len; i++) { | ||
11 | - listeners[i](v) | ||
10 … | + var cachedListeners = listeners.slice(0) | ||
11 … | + for (var i = 0, len = cachedListeners.length; i < len; i++) { | ||
12 … | + cachedListeners[i](v) | ||
12 | 13 … | } | |
13 | 14 … | } | |
14 | 15 … | ||
15 | 16 … | return observable | |
Built with git-ssb-web