12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- export default {
- /**
- * 返回一个自带消抖效果的函数,用res表示。
- *
- * fn: 需要被消抖的函数
- * delay: 消抖时长
- * isImmediateCall: 是否在一组操作中的第一次调用时立即执行fn
- * isRememberLastCall:是否在一组中最后一次调用后等delay时长再执行fn
- */
- debounce(fn, delay = 250, isImmediateCall = true, isRememberLastCall = true) {
- console.assert(isImmediateCall || isRememberLastCall, 'isImmediateCall 和 isRememberLastCall 至少应有一个是true,否则没有意义!')
- let timer = null
- // 上次调用的时刻
- let lastCallTime = 0
- if (isImmediateCall && !isRememberLastCall) {
- return function (...args) {
- const currentTime = Date.now()
- if (currentTime - lastCallTime >= delay) {
- fn.apply(this, args)
- }
- lastCallTime = currentTime
- }
- } else if (!isImmediateCall && isRememberLastCall) {
- return function (...args) {
- if (timer) {
- clearTimeout(timer)
- }
- timer = setTimeout(() => {
- fn.apply(this, args)
- }, delay)
- }
- } else if (isImmediateCall && isRememberLastCall) {
- return function (...args) {
- const currentTime = Date.now()
- if (currentTime - lastCallTime >= delay) { // 一组操作中的第一次
- fn.apply(this, args)
- lastCallTime = currentTime
- return
- } else { // 一组中的后续调用
- if (timer) { // 在此之前存在中间调用
- lastCallTime = currentTime
- clearTimeout(timer)
- }
- timer = setTimeout(() => {
- fn.apply(this, args)
- lastCallTime = 0
- timer = null
- }, delay)
- }
- }
- } else {
- console.error('不应该执行到这里!')
- }
- },
- throttle(fn, interval = 250) {
- let lastRunTime = 0
- return function (...args) {
- let elapsedTime = Date.now() - lastRunTime
- if (elapsedTime < interval) {
- return null
- }
- let context = this
- lastRunTime = Date.now()
- return fn.apply(context, args)
- }
- },
- }
|