Permalink
Cannot retrieve contributors at this time
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
72 lines (67 sloc)
2.6 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var debounce = require('./debounce'), | |
| isObject = require('../lang/isObject'); | |
| /** Used as the `TypeError` message for "Functions" methods. */ | |
| var FUNC_ERROR_TEXT = 'Expected a function'; | |
| /** Used as an internal `_.debounce` options object by `_.throttle`. */ | |
| var debounceOptions = { | |
| 'leading': false, | |
| 'maxWait': 0, | |
| 'trailing': false | |
| }; | |
| /** | |
| * Creates a function that only invokes `func` at most once per every `wait` | |
| * milliseconds. The created function comes with a `cancel` method to cancel | |
| * delayed invocations. Provide an options object to indicate that `func` | |
| * should be invoked on the leading and/or trailing edge of the `wait` timeout. | |
| * Subsequent calls to the throttled function return the result of the last | |
| * `func` call. | |
| * | |
| * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked | |
| * on the trailing edge of the timeout only if the the throttled function is | |
| * invoked more than once during the `wait` timeout. | |
| * | |
| * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation) | |
| * for details over the differences between `_.throttle` and `_.debounce`. | |
| * | |
| * @static | |
| * @memberOf _ | |
| * @category Function | |
| * @param {Function} func The function to throttle. | |
| * @param {number} [wait=0] The number of milliseconds to throttle invocations to. | |
| * @param {Object} [options] The options object. | |
| * @param {boolean} [options.leading=true] Specify invoking on the leading | |
| * edge of the timeout. | |
| * @param {boolean} [options.trailing=true] Specify invoking on the trailing | |
| * edge of the timeout. | |
| * @returns {Function} Returns the new throttled function. | |
| * @example | |
| * | |
| * // avoid excessively updating the position while scrolling | |
| * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); | |
| * | |
| * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes | |
| * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, { | |
| * 'trailing': false | |
| * })); | |
| * | |
| * // cancel a trailing throttled call | |
| * jQuery(window).on('popstate', throttled.cancel); | |
| */ | |
| function throttle(func, wait, options) { | |
| var leading = true, | |
| trailing = true; | |
| if (typeof func != 'function') { | |
| throw new TypeError(FUNC_ERROR_TEXT); | |
| } | |
| if (options === false) { | |
| leading = false; | |
| } else if (isObject(options)) { | |
| leading = 'leading' in options ? !!options.leading : leading; | |
| trailing = 'trailing' in options ? !!options.trailing : trailing; | |
| } | |
| debounceOptions.leading = leading; | |
| debounceOptions.maxWait = +wait; | |
| debounceOptions.trailing = trailing; | |
| return debounce(func, wait, debounceOptions); | |
| } | |
| module.exports = throttle; |