60 lines
1.6 KiB
TypeScript
Executable File
60 lines
1.6 KiB
TypeScript
Executable File
/**
|
|
* Returns a function, that, as long as it continues to be invoked, will not
|
|
* be triggered. The function will be called after it stops being called for
|
|
* N milliseconds. If `immediate` is passed, trigger the function on the
|
|
* leading edge, instead of the trailing. The function also has a property 'clear'
|
|
* that is a function which will clear the timer to prevent previously scheduled executions.
|
|
*
|
|
* @source underscore.js
|
|
* @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/
|
|
* @param {Function} function to wrap
|
|
* @param {Number} timeout in ms (`100`)
|
|
* @param {Boolean} whether to execute at the beginning (`false`)
|
|
* @api public
|
|
*/
|
|
|
|
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
export function Debounce(func: Function, wait?: number, immediate?: boolean) {
|
|
// @ts-ignore
|
|
let timeout: any,
|
|
args: any,
|
|
context: any,
|
|
timestamp: any,
|
|
result: any
|
|
if (wait == null) wait = 100
|
|
|
|
function later() {
|
|
const last = Date.now() - timestamp
|
|
|
|
// @ts-ignore
|
|
if (last < wait && last > 0) {
|
|
// @ts-ignore
|
|
timeout = setTimeout(later, wait - last)
|
|
} else {
|
|
timeout = null
|
|
if (!immediate) {
|
|
result = func.apply(context, args)
|
|
context = args == null
|
|
}
|
|
}
|
|
}
|
|
|
|
/*return function a2() {
|
|
// @ts-ignore
|
|
context = this
|
|
// @ts-ignore
|
|
// args = arguments
|
|
timestamp = Date.now()
|
|
const callNow = immediate && !timeout
|
|
if (!timeout) {
|
|
timeout = setTimeout(later, wait)
|
|
}
|
|
if (callNow) {
|
|
result = func.apply(context, args)
|
|
context = args == null
|
|
}
|
|
|
|
return result
|
|
}*/
|
|
}
|