| var debounce = require('./debounce'), |
| isObject = require('../lang/isObject'); |
| |
| /** Used as the `TypeError` message for "Functions" methods. */ |
| var FUNC_ERROR_TEXT = 'Expected a function'; |
| |
| /** |
| * Creates a throttled function that only invokes `func` at most once per |
| * every `wait` milliseconds. The throttled 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; |
| } |
| return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing }); |
| } |
| |
| module.exports = throttle; |