Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(369)

Unified Diff: ui/file_manager/file_manager/common/js/async_util.js

Issue 488043003: Aggregate consecutive rescan request as much as possible. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Revive AsyncUtil.Aggregation. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | ui/file_manager/file_manager/foreground/js/directory_model.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/file_manager/file_manager/common/js/async_util.js
diff --git a/ui/file_manager/file_manager/common/js/async_util.js b/ui/file_manager/file_manager/common/js/async_util.js
index c6627a0e942fd259dc55e2635f1c78757e8adfe6..745bee6a55258d6d553b228ef1fdced978764350 100644
--- a/ui/file_manager/file_manager/common/js/async_util.js
+++ b/ui/file_manager/file_manager/common/js/async_util.js
@@ -255,6 +255,82 @@ AsyncUtil.Group.prototype.finish_ = function(task) {
};
/**
+ * Aggregates consecutive calls and executes the closure only once instead of
+ * several times. The first call is always called immediately, and the next
+ * consecutive ones are aggregated and the closure is called only once once
+ * |delay| amount of time passes after the last call to run().
+ *
+ * @param {function()} closure Closure to be aggregated.
+ * @param {number=} opt_delay Minimum aggregation time in milliseconds. Default
+ * is 50 milliseconds.
+ * @constructor
+ */
+AsyncUtil.Aggregator = function(closure, opt_delay) {
+ /**
+ * @type {number}
+ * @private
+ */
+ this.delay_ = opt_delay || 50;
+
+ /**
+ * @type {function()}
+ * @private
+ */
+ this.closure_ = closure;
+
+ /**
+ * @type {number?}
+ * @private
+ */
+ this.scheduledRunsTimer_ = null;
+
+ /**
+ * @type {number}
+ * @private
+ */
+ this.lastRunTime_ = 0;
+};
+
+/**
+ * Runs a closure. Skips consecutive calls. The first call is called
+ * immediately.
+ */
+AsyncUtil.Aggregator.prototype.run = function() {
+ // If recently called, then schedule the consecutive call with a delay.
+ if (Date.now() - this.lastRunTime_ < this.delay_) {
+ this.cancelScheduledRuns_();
+ this.scheduledRunsTimer_ = setTimeout(this.runImmediately_.bind(this),
+ this.delay_ + 1);
+ this.lastRunTime_ = Date.now();
+ return;
+ }
+
+ // Otherwise, run immediately.
+ this.runImmediately_();
+};
+
+/**
+ * Calls the schedule immediately and cancels any scheduled calls.
+ * @private
+ */
+AsyncUtil.Aggregator.prototype.runImmediately_ = function() {
+ this.cancelScheduledRuns_();
+ this.closure_();
+ this.lastRunTime_ = Date.now();
+};
+
+/**
+ * Cancels all scheduled runs (if any).
+ * @private
+ */
+AsyncUtil.Aggregator.prototype.cancelScheduledRuns_ = function() {
+ if (this.scheduledRunsTimer_) {
+ clearTimeout(this.scheduledRunsTimer_);
+ this.scheduledRunsTimer_ = null;
+ }
+};
+
+/**
* Samples calls so that they are not called too frequently.
* The first call is always called immediately, and the following calls may
* be skipped or delayed to keep each interval no less than |minInterval_|.
« no previous file with comments | « no previous file | ui/file_manager/file_manager/foreground/js/directory_model.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698