yanan.wang
Version:
This is a toolset
101 lines (87 loc) • 2.36 kB
JavaScript
/**
* @method
* @desc 防抖函数
* @param {function} fn 执行的函数
* @param {Number} delay 延迟时间
* @param {Boolean} immediate 第一次是否立即执行
* @param {Function} callback 回调函数
*/
function debounce(fn, delay, immediate = false , callback) {
let isInvoke = true
let timer = null;
const foo = function(event) {
return new Promise((resolve, reject) => {
let result = null
try {
if(isInvoke && isInvoke) {
result = fn.apply(this,[event])
callback && callback(result)
resolve(result)
isInvoke = false
} else {
//有值得话定时器状态一定是启动
if(timer) clearTimeout(timer)
timer = setTimeout(() => {
result = fn.apply(this,[event])
callback && callback(result)
resolve(result)
timer = null
isInvoke = false
}, delay);
}
} catch (error) {
reject(error)
}
})
}
//这里不要用this
foo.cancel = function() {
if(timer) {
clearTimeout(timer);
timer = null
}
}
return foo
}
/**
* @method
* @desc 节流函数
* @param {function} fn 执行的函数
* @param {Number} delay
* @param {Boolean} immediate 第一次是否立即执行
* @param {Boolean} ending 最后一次是否执行
*/
function throttle(fn, delay, immediate = true, ending = true) {
let timer = null;
let isInvoke = true
let startTime = 0
function _throttle(event) {
let nowTime = new Date().valueOf()
return new Promise((resolve, reject) => {
let waitTime = delay - (nowTime - startTime)
//判断立即执行
if(!immediate && startTime === 0) {
startTime = nowTime
}
//基本节流实现
if(waitTime <= 0) {
resolve(fn.apply(this, [event]))
timer && clearTimeout(timer)
startTime = nowTime;
timer = null
}
//尾部执行
if(ending && !timer) {
timer = setTimeout(() => {
resolve(fn.apply(this, [event]))
startTime = Date.now();
timer = null
}, waitTime);
}
})
}
return _throttle
}
module.exports = {
throttle, debounce
}