1234567891011121314151617181920212223242526272829303132333435 |
- import restArguments from './restArguments.js';
- import delay from './delay.js';
-
- // When a sequence of calls of the returned function ends, the argument
- // function is triggered. The end of a sequence is defined by the `wait`
- // parameter. If `immediate` is passed, the argument function will be
- // triggered at the beginning of the sequence instead of at the end.
- export default function debounce(func, wait, immediate) {
- var timeout, result;
-
- var later = function(context, args) {
- timeout = null;
- if (args) result = func.apply(context, args);
- };
-
- var debounced = restArguments(function(args) {
- if (timeout) clearTimeout(timeout);
- if (immediate) {
- var callNow = !timeout;
- timeout = setTimeout(later, wait);
- if (callNow) result = func.apply(this, args);
- } else {
- timeout = delay(later, wait, this, args);
- }
-
- return result;
- });
-
- debounced.cancel = function() {
- clearTimeout(timeout);
- timeout = null;
- };
-
- return debounced;
- }
|