Skip to content
This repository has been archived by the owner on Oct 19, 2018. It is now read-only.

need to make sure observer has not been deleted before doing a delayed update #6

Open
catmando opened this issue Sep 9, 2017 · 0 comments

Comments

@catmando
Copy link
Contributor

catmando commented Sep 9, 2017

SetState is generally delayed to the end of the rendering cycle, and all updates are sorted and queued to prevent multiple updates of the same value.

If component A gets a state update during this delayed update process, and that causes another component to unmount, and that component is scheduled to receive state updates, react.js generates a warning (because you will attempt to do a state update on an unmounted component.)

The fix is to simply check to see if the observer has been removed from the current_observers list.

module React
  class State

    def self.set_state(object, name, value, delay=ALWAYS_UPDATE_STATE_AFTER_RENDER)
      states[object][name] = value
      if delay || @bulk_update_flag
        @delayed_updates ||= Hash.new { |h, k| h[k] = {} }
        @delayed_updates[object][name] = [value, Set.new]
        @delayed_updater ||= after(0.001) do
          delayed_updates = @delayed_updates
          @delayed_updates = Hash.new { |h, k| h[k] = {} }
          @delayed_updater = nil
          updates = Hash.new { |hash, key| hash[key] = Array.new }
          delayed_updates.each do |object, name_hash|
            name_hash.each do |name, value_and_set|
              set_state2(object, name, value_and_set[0], updates, value_and_set[1])
            end
          end
          updates.each { |observer, args|
            observer.update_react_js_state(*args) if current_observers.key?(observer)
          }
          updates = nil
        end
      elsif @rendering_level == 0
        updates = Hash.new { |hash, key| hash[key] = Array.new }
        set_state2(object, name, value, updates)
        updates.each { |observer, args| observer.update_react_js_state(*args) }
      end
      value
    end
  end
end

The above code will work as a patch if you want to try it.

@ruby-hyperloop ruby-hyperloop deleted a comment from barriehadfield Sep 10, 2017
@catmando catmando added this to the Release 0.15 milestone Nov 15, 2017
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

1 participant