| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- // @ts-nocheck
- /**
- * 节流函数,用于限制函数的调用频率
- * @param fn 要进行节流的函数
- * @param delay 两次调用之间的最小间隔时间
- * @returns 节流后的函数
- */
- // #ifndef UNI-APP-X && APP
- // export function throttle(fn: (...args: any[]) => void, delay: number, options) {
- // let flag = true; // 标记是否可以执行函数
- // return (...args: any[]) => {
- // if (flag) {
- // flag = false; // 设置为不可执行状态
- // fn(...args); // 执行传入的函数
-
- // setTimeout(() => {
- // flag = true; // 经过指定时间后,设置为可执行状态
- // }, delay);
- // }
- // };
- // }
- export function throttle<T extends (...args: any[]) => void>(
- fn: T,
- delay: number,
- { leading = true, trailing = true }: { leading?: boolean; trailing?: boolean } = {}
- ): (...args: Parameters<T>) => void {
- let isCoolingDown = false;
- let lastArgs: Parameters<T> | null = null;
- let timerId: ReturnType<typeof setTimeout> | null = null;
- const executeTrailing = () => {
- if (trailing && lastArgs) {
- fn(...lastArgs);
- lastArgs = null;
- }
- isCoolingDown = false;
- timerId = null;
- };
- return function (...args: Parameters<T>) {
- // 1. 如果不在冷却期,且 leading=true,立即执行
- if (!isCoolingDown && leading) {
- fn(...args);
- isCoolingDown = true;
- timerId = setTimeout(executeTrailing, delay);
- }
- // 2. 如果在冷却期,记录最后一次调用的参数(用于 trailing)
- else if (trailing) {
- lastArgs = args;
- }
- };
- }
- // #endif
- // #ifdef UNI-APP-X && APP
- // type Rfun = (...args: any[]) => void
- // type Rfun = (...args: any[]) => void
- export function throttle<T extends any|null>(
- fn: (args : T) => void,
- delay: number):(args : T) => void {
- let flag = true; // 标记是否可以执行函数
-
- return (args : T) =>{
- if(flag){
- flag = false;
- fn(args);
-
- setTimeout(()=>{
- flag = true;
- }, delay)
- }
- }
- // return (...args: any[]) => {
- // // if (flag) {
- // // flag = false; // 设置为不可执行状态
- // // fn(...args); // 执行传入的函数
- // // setTimeout(() => {
- // // flag = true; // 经过指定时间后,设置为可执行状态
- // // }, delay);
- // // }
- // };
- }
- // #endif
- // // 示例
- // // 定义一个被节流的函数
- // function handleScroll() {
- // console.log("Scroll event handled!");
- // }
- // // 使用节流函数对 handleScroll 进行节流,间隔时间为 500 毫秒
- // const throttledScroll = throttle(handleScroll, 500);
- // // 模拟多次调用 handleScroll
- // throttledScroll(); // 输出 "Scroll event handled!"
- // throttledScroll(); // 不会输出
- // throttledScroll(); // 不会输出
- // // 经过 500 毫秒后,再次调用 handleScroll
- // setTimeout(() => {
- // throttledScroll(); // 输出 "Scroll event handled!"
- // }, 500);
|