You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1002 B
42 lines
1002 B
// 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); |
|
}; |
|
};
|
|
|