From fb9d15e03e4e763ffd3bcd35c264dbdacc30aede Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 22 Jul 2015 16:03:39 -0600 Subject: [PATCH] Throttle document polling --- src/view-registry.coffee | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/view-registry.coffee b/src/view-registry.coffee index 20c88394e..58b2bf7c0 100644 --- a/src/view-registry.coffee +++ b/src/view-registry.coffee @@ -1,6 +1,7 @@ {find} = require 'underscore-plus' Grim = require 'grim' {Disposable} = require 'event-kit' +_ = require 'underscore-plus' # Essential: `ViewRegistry` handles the association between model and view # types in Atom. We call this association a View Provider. As in, for a given @@ -45,6 +46,8 @@ class ViewRegistry documentUpdateRequested: false documentReadInProgress: false performDocumentPollAfterUpdate: false + debouncedPerformDocumentPoll: null + minimumPollInterval: 200 constructor: -> @views = new WeakMap @@ -53,7 +56,8 @@ class ViewRegistry @documentReaders = [] @documentPollers = [] - @observer = new MutationObserver(@performDocumentPoll) + @observer = new MutationObserver(@requestDocumentPoll) + @debouncedPerformDocumentPoll = _.throttle(@performDocumentPoll, @minimumPollInterval).bind(this) # Essential: Add a provider that will be used to construct views in the # workspace's view layer based on model objects in its model layer. @@ -208,16 +212,19 @@ class ViewRegistry writer() while writer = @documentWriters.shift() startPollingDocument: -> - window.addEventListener('resize', @performDocumentPoll) + window.addEventListener('resize', @requestDocumentPoll) @observer.observe(document, {subtree: true, childList: true, attributes: true}) stopPollingDocument: -> - window.removeEventListener('resize', @performDocumentPoll) + window.removeEventListener('resize', @requestDocumentPoll) @observer.disconnect() - performDocumentPoll: => + requestDocumentPoll: => if @documentUpdateRequested @performDocumentPollAfterUpdate = true else - poller() for poller in @documentPollers - return + @debouncedPerformDocumentPoll() + + performDocumentPoll: -> + poller() for poller in @documentPollers + return