index_old.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // @ts-nocheck
  2. /**
  3. * 节流函数,用于限制函数的调用频率
  4. * @param fn 要进行节流的函数
  5. * @param delay 两次调用之间的最小间隔时间
  6. * @returns 节流后的函数
  7. */
  8. // #ifndef UNI-APP-X && APP
  9. // export function throttle(fn: (...args: any[]) => void, delay: number, options) {
  10. // let flag = true; // 标记是否可以执行函数
  11. // return (...args: any[]) => {
  12. // if (flag) {
  13. // flag = false; // 设置为不可执行状态
  14. // fn(...args); // 执行传入的函数
  15. // setTimeout(() => {
  16. // flag = true; // 经过指定时间后,设置为可执行状态
  17. // }, delay);
  18. // }
  19. // };
  20. // }
  21. export function throttle<T extends (...args: any[]) => void>(
  22. fn: T,
  23. delay: number,
  24. { leading = true, trailing = true }: { leading?: boolean; trailing?: boolean } = {}
  25. ): (...args: Parameters<T>) => void {
  26. let isCoolingDown = false;
  27. let lastArgs: Parameters<T> | null = null;
  28. let timerId: ReturnType<typeof setTimeout> | null = null;
  29. const executeTrailing = () => {
  30. if (trailing && lastArgs) {
  31. fn(...lastArgs);
  32. lastArgs = null;
  33. }
  34. isCoolingDown = false;
  35. timerId = null;
  36. };
  37. return function (...args: Parameters<T>) {
  38. // 1. 如果不在冷却期,且 leading=true,立即执行
  39. if (!isCoolingDown && leading) {
  40. fn(...args);
  41. isCoolingDown = true;
  42. timerId = setTimeout(executeTrailing, delay);
  43. }
  44. // 2. 如果在冷却期,记录最后一次调用的参数(用于 trailing)
  45. else if (trailing) {
  46. lastArgs = args;
  47. }
  48. };
  49. }
  50. // #endif
  51. // #ifdef UNI-APP-X && APP
  52. // type Rfun = (...args: any[]) => void
  53. // type Rfun = (...args: any[]) => void
  54. export function throttle<T extends any|null>(
  55. fn: (args : T) => void,
  56. delay: number):(args : T) => void {
  57. let flag = true; // 标记是否可以执行函数
  58. return (args : T) =>{
  59. if(flag){
  60. flag = false;
  61. fn(args);
  62. setTimeout(()=>{
  63. flag = true;
  64. }, delay)
  65. }
  66. }
  67. // return (...args: any[]) => {
  68. // // if (flag) {
  69. // // flag = false; // 设置为不可执行状态
  70. // // fn(...args); // 执行传入的函数
  71. // // setTimeout(() => {
  72. // // flag = true; // 经过指定时间后,设置为可执行状态
  73. // // }, delay);
  74. // // }
  75. // };
  76. }
  77. // #endif
  78. // // 示例
  79. // // 定义一个被节流的函数
  80. // function handleScroll() {
  81. // console.log("Scroll event handled!");
  82. // }
  83. // // 使用节流函数对 handleScroll 进行节流,间隔时间为 500 毫秒
  84. // const throttledScroll = throttle(handleScroll, 500);
  85. // // 模拟多次调用 handleScroll
  86. // throttledScroll(); // 输出 "Scroll event handled!"
  87. // throttledScroll(); // 不会输出
  88. // throttledScroll(); // 不会输出
  89. // // 经过 500 毫秒后,再次调用 handleScroll
  90. // setTimeout(() => {
  91. // throttledScroll(); // 输出 "Scroll event handled!"
  92. // }, 500);