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

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

Issue 329083002: Modify AsyncUtil.Aggregation to be able to keep calling in limited rate. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Seal the newed RateLimiter object. Created 6 years, 6 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/file_grid.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 1811e19785bd69d6e29457aa122a64d1dc7b5df2..c6627a0e942fd259dc55e2635f1c78757e8adfe6 100644
--- a/ui/file_manager/file_manager/common/js/async_util.js
+++ b/ui/file_manager/file_manager/common/js/async_util.js
@@ -255,65 +255,72 @@ 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().
+ * 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_|.
*
- * @param {function()} closure Closure to be aggregated.
- * @param {number=} opt_delay Minimum aggregation time in milliseconds. Default
- * is 50 milliseconds.
+ * @param {function()} closure Closure to be called.
+ * @param {number=} opt_minInterval Minimum interval between each call in
+ * milliseconds. Default is 200 milliseconds.
* @constructor
*/
-AsyncUtil.Aggregation = function(closure, opt_delay) {
+AsyncUtil.RateLimiter = function(closure, opt_minInterval) {
/**
- * @type {number}
+ * @type {function()}
* @private
*/
- this.delay_ = opt_delay || 50;
+ this.closure_ = closure;
/**
- * @type {function()}
+ * @type {number}
* @private
*/
- this.closure_ = closure;
+ this.minInterval_ = opt_minInterval || 200;
/**
- * @type {number?}
+ * @type {number}
* @private
*/
- this.scheduledRunsTimer_ = null;
+ this.scheduledRunsTimer_ = 0;
/**
+ * This variable remembers the last time the closure is called.
* @type {number}
* @private
*/
this.lastRunTime_ = 0;
+
+ Object.seal(this);
};
/**
- * Runs a closure. Skips consecutive calls. The first call is called
- * immediately.
+ * Requests to run the closure.
+ * Skips or delays calls so that the intervals between calls are no less than
+ * |minInteval_| milliseconds.
*/
-AsyncUtil.Aggregation.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();
+AsyncUtil.RateLimiter.prototype.run = function() {
+ var now = Date.now();
+ // If |minInterval| has not passed since the closure is run, skips or delays
+ // this run.
+ if (now - this.lastRunTime_ < this.minInterval_) {
+ // Delays this run only when there is no scheduled run.
+ // Otherwise, simply skip this run.
+ if (!this.scheduledRunsTimer_) {
+ this.scheduledRunsTimer_ = setTimeout(
+ this.runImmediately.bind(this),
+ this.lastRunTime_ + this.minInterval_ - now);
+ }
return;
}
- // Otherwise, run immediately.
- this.runImmediately_();
+ // Otherwise, run immediately
+ this.runImmediately();
};
/**
- * Calls the schedule immediately and cancels any scheduled calls.
- * @private
+ * Calls the scheduled run immediately and cancels any scheduled calls.
*/
-AsyncUtil.Aggregation.prototype.runImmediately_ = function() {
+AsyncUtil.RateLimiter.prototype.runImmediately = function() {
this.cancelScheduledRuns_();
this.closure_();
this.lastRunTime_ = Date.now();
@@ -323,9 +330,9 @@ AsyncUtil.Aggregation.prototype.runImmediately_ = function() {
* Cancels all scheduled runs (if any).
* @private
*/
-AsyncUtil.Aggregation.prototype.cancelScheduledRuns_ = function() {
+AsyncUtil.RateLimiter.prototype.cancelScheduledRuns_ = function() {
if (this.scheduledRunsTimer_) {
clearTimeout(this.scheduledRunsTimer_);
- this.scheduledRunsTimer_ = null;
+ this.scheduledRunsTimer_ = 0;
}
};
« no previous file with comments | « no previous file | ui/file_manager/file_manager/foreground/js/file_grid.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698