123456789101112131415161718192021222324252627282930313233343536373839404142 |
- // It's actually "debounce"
- "use strict";
- var isValue = require("es5-ext/object/is-value")
- , callable = require("es5-ext/object/valid-callable")
- , nextTick = require("next-tick")
- , validTimeout = require("./valid-timeout");
- var apply = Function.prototype.apply;
- module.exports = function (fn/*, timeout*/) {
- var scheduled, run, context, args, delay, timeout = arguments[1], handle;
- callable(fn);
- if (isValue(timeout)) {
- timeout = validTimeout(timeout);
- delay = setTimeout;
- } else {
- delay = nextTick;
- }
- run = function () {
- if (!scheduled) return; // IE8 tends to not clear immediate timeouts properly
- scheduled = false;
- handle = null;
- apply.call(fn, context, args);
- context = null;
- args = null;
- };
- return function () {
- if (scheduled) {
- if (!isValue(handle)) {
- // 'nextTick' based, no room for debounce
- return;
- }
- clearTimeout(handle);
- }
- scheduled = true;
- context = this;
- args = arguments;
- handle = delay(run, timeout);
- };
- };
|