summaryrefslogtreecommitdiffstats
path: root/devtools/shared/debounce.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/shared/debounce.js')
-rw-r--r--devtools/shared/debounce.js45
1 files changed, 45 insertions, 0 deletions
diff --git a/devtools/shared/debounce.js b/devtools/shared/debounce.js
new file mode 100644
index 0000000000..d43dea48d5
--- /dev/null
+++ b/devtools/shared/debounce.js
@@ -0,0 +1,45 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+/**
+ * Create a debouncing function wrapper to only call the target function after a certain
+ * amount of time has passed without it being called.
+ *
+ * @param {Function} func
+ * The function to debounce
+ * @param {number} wait
+ * The wait period
+ * @param {Object} scope
+ * The scope to use for func
+ * @return {Function} The debounced function, which has a `cancel` method that the
+ * consumer can call to cancel any pending setTimeout callback.
+ */
+exports.debounce = function (func, wait, scope) {
+ let timer = null;
+
+ function clearTimer(resetTimer = false) {
+ if (timer) {
+ clearTimeout(timer);
+ }
+ if (resetTimer) {
+ timer = null;
+ }
+ }
+
+ const debouncedFunction = function () {
+ clearTimer();
+
+ const args = arguments;
+ timer = setTimeout(function () {
+ timer = null;
+ func.apply(scope, args);
+ }, wait);
+ };
+
+ debouncedFunction.cancel = clearTimer.bind(null, true);
+
+ return debouncedFunction;
+};