utils.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. getPaintingSize(raw) {
  76. const temp = raw.split('\n')
  77. let height = temp[0]
  78. let width = temp[1]
  79. height = Number(height.substring(1, height.length - 2))
  80. width = Number(width.substring(1, width.length - 2))
  81. return {
  82. width,
  83. height,
  84. }
  85. },
  86. }