• 节流除非是开启了尾调用否则是立即执行的,也就不需要防抖的cancel与flush

    类型参数

    • CB extends ((...args: any[]) => any)

    参数

    • callback: CB

      需要被节流函数包裹的函数

    • interval: number

      间隔时间

    • options: {
          invalidCB?: ((timeCountDown: number) => void);
          trailing?: boolean;
          leading?: boolean;
      } = {}
      • 可选invalidCB?: ((timeCountDown: number) => void)

        间隔期间调用throttle返回的函数执行的回调 例如一个按钮5秒点击一次,不可点击时执行该函数

          • (timeCountDown): void
          • 参数

            • timeCountDown: number

            返回 void

      • 可选trailing?: boolean

        尾调用

      • 可选leading?: boolean

        首调用;未开启时是有个初始倒计时的,为true时关闭初始倒计时,默认true

    返回 CB

    // ----------- 基础用法 -----------
    let count = 0;
    let elseCount = 0;
    let res = '';
    const wrapFn = throttle((_res: string) => (count++, (res = _res)), 10, {
    invalidCB() {
    elseCount++;
    },
    });

    wrapFn('0');
    wrapFn('1');
    wrapFn('2');

    res; // '0'
    elseCount; // 2

    // ----------- 首调用 -----------
    let times = 0;

    let wrapFn = throttle(() => times++, 100, { leading: false });
    // 初始时时0次
    times; // 0
    // 执行一次
    wrapFn();
    // 由于节流包裹函数时就开启了节流,此时还在时间内,所以内部不执行
    times; // 0
    await sleep(120);
    // 上一次执行的被丢弃了
    times; // 0
    // 在间隔期外执行
    wrapFn();
    // 此时成功执行
    times; // 1

    times = 0;
    // 立即执行
    wrapFn = throttle(fn, 100, { leading: true });
    times; // 0
    wrapFn();
    // 由于节流包裹时未开启计时,所以
    times; // 1

    // ----------- 尾调用 -----------

    let times = 0;
    const wrapFn = throttle(() => times++, 100, { leading: false, trailing: true });
    // 初始时时0次
    times; // 0
    // 执行一次
    wrapFn();
    wrapFn();
    wrapFn();
    // 由于节流包裹函数时就开启了节流,此时还在时间内,所以内部不执行
    times; // 0
    await sleep(120);
    // 上一次执行的不会被丢弃
    times; // 1