utils.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. getRandomString(length = 32) {
  68. let charSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  69. let ret = ""
  70. for (let i = 0; i < length; i++) {
  71. ret += charSet.charAt(Math.floor(Math.random() * charSet.length))
  72. }
  73. return ret
  74. }
  75. }