utils.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. export default {
  2. /**
  3. * 返回一个自带消抖效果的函数,用res表示。
  4. *
  5. * fn: 需要被消抖的函数
  6. * delay: 消抖时长
  7. * isImmediateCall: 是否在一组操作中的第一次调用时立即执行fn
  8. * isRememberLastCall:是否在一组中最后一次调用后等delay时长再执行fn
  9. */
  10. debounce(fn, delay = 250, isImmediateCall = true, isRememberLastCall = true) {
  11. console.assert(isImmediateCall || isRememberLastCall, 'isImmediateCall 和 isRememberLastCall 至少应有一个是true,否则没有意义!')
  12. let timer = null
  13. // 上次调用的时刻
  14. let lastCallTime = 0
  15. if (isImmediateCall && !isRememberLastCall) {
  16. return function (...args) {
  17. const currentTime = Date.now()
  18. if (currentTime - lastCallTime >= delay) {
  19. fn.apply(this, args)
  20. }
  21. lastCallTime = currentTime
  22. }
  23. } else if (!isImmediateCall && isRememberLastCall) {
  24. return function (...args) {
  25. if (timer) {
  26. clearTimeout(timer)
  27. }
  28. timer = setTimeout(() => {
  29. fn.apply(this, args)
  30. }, delay)
  31. }
  32. } else if (isImmediateCall && isRememberLastCall) {
  33. return function (...args) {
  34. const currentTime = Date.now()
  35. if (currentTime - lastCallTime >= delay) { // 一组操作中的第一次
  36. fn.apply(this, args)
  37. lastCallTime = currentTime
  38. return
  39. } else { // 一组中的后续调用
  40. if (timer) { // 在此之前存在中间调用
  41. lastCallTime = currentTime
  42. clearTimeout(timer)
  43. }
  44. timer = setTimeout(() => {
  45. fn.apply(this, args)
  46. lastCallTime = 0
  47. timer = null
  48. }, delay)
  49. }
  50. }
  51. } else {
  52. console.error('不应该执行到这里!')
  53. }
  54. },
  55. throttle(fn, interval = 250) {
  56. let lastRunTime = 0
  57. return function (...args) {
  58. let elapsedTime = Date.now() - lastRunTime
  59. if (elapsedTime < interval) {
  60. return null
  61. }
  62. let context = this
  63. lastRunTime = Date.now()
  64. return fn.apply(context, args)
  65. }
  66. },
  67. }