@@ -177,7 +177,6 @@ exports.addObserver = function(observerState, getter, handler) {
177177
178178 if ( storeDeps . size === 0 ) {
179179 // no storeDeps means the observer is dependent on any of the state changing
180-
181180 updatedObserverState = updatedObserverState . updateIn ( [ 'any' ] , getters => getters . add ( getter ) )
182181 } else {
183182 updatedObserverState = updatedObserverState . withMutations ( map => {
@@ -246,24 +245,34 @@ exports.removeObserverByEntry = function(observerState, entry) {
246245 const getter = entry . get ( 'getter' )
247246 const storeDeps = entry . get ( 'storeDeps' )
248247
249- map . updateIn ( [ 'gettersMap' , getter ] , observerIds => observerIds . remove ( id ) ) ;
250-
251- if ( map . getIn ( [ 'gettersMap' , getter ] ) . size <= 0 ) {
248+ const observerIds = map . getIn ( [ 'gettersMap' , getter ] )
249+ if ( ! observerIds ) {
250+ // getter doesn't exist if reactor.reset() is called before the unwatchFn()
251+ return
252+ }
253+ const updatedObserverIds = observerIds . remove ( id )
254+ map . setIn ( [ 'gettersMap' , getter ] , updatedObserverIds )
252255
256+ if ( updatedObserverIds . size === 0 ) {
257+ // all observers have been removed for this getter, remove other entries
253258 if ( storeDeps . size === 0 ) {
254259 // no storeDeps means the observer is dependent on any of the state changing
255260 map . update ( 'any' , getters => getters . remove ( getter ) ) ;
256261 } else {
257262 storeDeps . forEach ( storeId => {
258- map . updateIn ( [ 'stores' , storeId ]
259- , getters => getters . remove ( getter ) )
263+ map . updateIn ( [ 'stores' , storeId ] , getters => {
264+ if ( getters ) {
265+ // check to make sure the getters Set exists for this store,
266+ // in the case of reactor.reset() is called before the unwatchFn()
267+ return getters . remove ( getter )
268+ }
269+ return getters
270+ } )
260271 } )
261272 }
262-
263273 }
264274
265275 map . removeIn ( [ 'observersMap' , id ] )
266-
267276 } )
268277}
269278
0 commit comments