UNPKG

yanan.wang

Version:

This is a toolset

101 lines (87 loc) 2.36 kB
/** * @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 }