зеркало из https://github.com/mozilla/gecko-dev.git
78 строки
1.9 KiB
JavaScript
78 строки
1.9 KiB
JavaScript
/* 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";
|
|
|
|
/**
|
|
* From underscore's `_.throttle`
|
|
* http://underscorejs.org
|
|
* (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|
* Underscore may be freely distributed under the MIT license.
|
|
*
|
|
* Returns a function, that, when invoked, will only be triggered at most once during a
|
|
* given window of time. The throttled function will run as much as it can, without ever
|
|
* going more than once per wait duration.
|
|
*
|
|
* @param {Function} func
|
|
* The function to throttle
|
|
* @param {number} wait
|
|
* The wait period
|
|
* @param {Object} scope
|
|
* The scope to use for func
|
|
* @return {Function} The throttled function
|
|
*/
|
|
function throttle(func, wait, scope) {
|
|
let args, result;
|
|
let timeout = null;
|
|
let previous = 0;
|
|
|
|
const later = function () {
|
|
previous = Date.now();
|
|
timeout = null;
|
|
result = func.apply(scope, args);
|
|
args = null;
|
|
};
|
|
|
|
const throttledFunction = function () {
|
|
const now = Date.now();
|
|
const remaining = wait - (now - previous);
|
|
args = arguments;
|
|
if (remaining <= 0) {
|
|
clearTimeout(timeout);
|
|
timeout = null;
|
|
previous = now;
|
|
result = func.apply(scope, args);
|
|
args = null;
|
|
} else if (!timeout) {
|
|
timeout = setTimeout(later, remaining);
|
|
}
|
|
return result;
|
|
};
|
|
|
|
function cancel() {
|
|
if (timeout) {
|
|
clearTimeout(timeout);
|
|
timeout = null;
|
|
}
|
|
previous = 0;
|
|
args = undefined;
|
|
result = undefined;
|
|
}
|
|
|
|
function flush() {
|
|
if (!timeout) {
|
|
return result;
|
|
}
|
|
previous = 0;
|
|
return throttledFunction();
|
|
}
|
|
|
|
throttledFunction.cancel = cancel;
|
|
throttledFunction.flush = flush;
|
|
|
|
return throttledFunction;
|
|
}
|
|
|
|
exports.throttle = throttle;
|