@@ -156,45 +156,73 @@ exports.loadState = function(reactorState, state) {
156156 */
157157exports . addObserver = function ( observerState , getter , handler ) {
158158 // use the passed in getter as the key so we can rely on a byreference call for unobserve
159- const getterKey = getter
160- if ( isKeyPath ( getter ) ) {
161- getter = fromKeyPath ( getter )
162- }
159+ try {
160+ const getterKey = getter
161+ if ( isKeyPath ( getter ) ) {
162+ getter = fromKeyPath ( getter )
163+ }
163164
164- const currId = observerState . get ( 'nextId' )
165- const storeDeps = getStoreDeps ( getter )
166- const entry = Immutable . Map ( {
167- id : currId ,
168- storeDeps : storeDeps ,
169- getterKey : getterKey ,
170- getter : getter ,
171- handler : handler ,
172- } )
165+ const currId = observerState . get ( 'nextId' )
166+ const storeDeps = getStoreDeps ( getter )
167+ const entry = Immutable . Map ( {
168+ id : currId ,
169+ storeDeps : storeDeps ,
170+ getterKey : getterKey ,
171+ getter : getter ,
172+ handler : handler ,
173+ } )
173174
174- let updatedObserverState
175- if ( storeDeps . size === 0 ) {
176- // no storeDeps means the observer is dependent on any of the state changing
177- updatedObserverState = observerState . update ( 'any' , observerIds => observerIds . add ( currId ) )
178- } else {
179- updatedObserverState = observerState . withMutations ( map => {
180- storeDeps . forEach ( storeId => {
181- let path = [ 'stores' , storeId ]
182- if ( ! map . hasIn ( path ) ) {
183- map . setIn ( path , Immutable . Set ( [ ] ) )
184- }
185- map . updateIn ( [ 'stores' , storeId ] , observerIds => observerIds . add ( currId ) )
175+ let updatedObserverState
176+
177+ let existingGetters = observerState . get ( 'getters' ) ;
178+
179+ let getterId = existingGetters . indexOf ( getter ) ;
180+
181+ if ( getterId < 0 ) {
182+ existingGetters . push ( getter ) ;
183+ getterId = existingGetters . length - 1 ;
184+ }
185+ //update getterMap
186+
187+ let observerIdsForGetter = observerState . getIn ( [ 'gettersMap' , getterId ] )
188+
189+ if ( ! observerIdsForGetter ) {
190+ observerIdsForGetter = Immutable . Set ( [ ] )
191+ }
192+
193+ observerIdsForGetter = observerIdsForGetter . add ( currId ) ;
194+
195+ updatedObserverState = observerState . setIn ( [ 'gettersMap' , getterId ] , observerIdsForGetter ) ;
196+
197+ if ( storeDeps . size === 0 ) {
198+ // no storeDeps means the observer is dependent on any of the state changing
199+
200+ updatedObserverState = updatedObserverState . updateIn ( [ 'any' ] , getters => getters . add ( getterId ) )
201+ } else {
202+ updatedObserverState = updatedObserverState . withMutations ( map => {
203+ storeDeps . forEach ( storeId => {
204+ let path = [ 'stores' , storeId ]
205+ if ( ! map . hasIn ( path ) ) {
206+ map . setIn ( path , Immutable . Set ( [ ] ) )
207+ }
208+ map . updateIn ( [ 'stores' , storeId ] , getters => getters . add ( getterId ) )
209+ } )
186210 } )
187- } )
188- }
211+ }
189212
190- updatedObserverState = updatedObserverState
191- . set ( 'nextId' , currId + 1 )
192- . setIn ( [ 'observersMap' , currId ] , entry )
213+ updatedObserverState = updatedObserverState
214+ . set ( 'nextId' , currId + 1 )
215+ . setIn ( [ 'observersMap' , currId ] , entry )
193216
194- return {
195- observerState : updatedObserverState ,
196- entry : entry ,
217+ return {
218+ observerState : updatedObserverState ,
219+ entry : entry ,
220+ }
221+ } catch ( e ) {
222+ debugger ;
197223 }
224+
225+
198226}
199227
200228/**
@@ -239,18 +267,31 @@ exports.removeObserver = function(observerState, getter, handler) {
239267 */
240268exports . removeObserverByEntry = function ( observerState , entry ) {
241269 return observerState . withMutations ( map => {
242- const id = entry . get ( 'id' )
243- const storeDeps = entry . get ( 'storeDeps' )
270+ try {
271+ const id = entry . get ( 'id' )
272+ const getter = entry . get ( 'getter' )
273+ const storeDeps = entry . get ( 'storeDeps' )
244274
245- if ( storeDeps . size === 0 ) {
246- map . update ( 'any' , anyObsevers => anyObsevers . remove ( id ) )
247- } else {
248- storeDeps . forEach ( storeId => {
249- map . updateIn ( [ 'stores' , storeId ] , observers => observers . remove ( id ) )
250- } )
275+ const existingGetters = observerState . get ( 'getters' ) ;
276+
277+ const getterId = existingGetters . indexOf ( getter ) ;
278+
279+ //cleaning the gettersMap
280+ map . updateIn ( [ 'gettersMap' , getterId ] , observerIds => observerIds . remove ( id ) ) ;
281+
282+ if ( storeDeps . size === 0 && map . getIn ( [ 'gettersMap' , getterId ] ) . size === 0 ) {
283+ map . update ( 'any' , anyGetters => anyGetters . remove ( getterId ) )
284+ } else {
285+ storeDeps . forEach ( storeId => {
286+ map . updateIn ( [ 'stores' , storeId ] , getters => getters . remove ( getterId ) )
287+ } )
288+ }
289+
290+ map . removeIn ( [ 'observersMap' , id ] )
291+ } catch ( e ) {
292+ debugger ;
251293 }
252294
253- map . removeIn ( [ 'observersMap' , id ] )
254295 } )
255296}
256297
0 commit comments