Spaces:
Runtime error
Runtime error
// It's actually "debounce" | |
; | |
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); | |
}; | |
}; | |