import { AsyncFunction, RealUndefined } from "./type"; /** * 定义一个类型,用于扩展函数类型,增加一个可选的 isExecuting 属性 */ export type SingleExecutionFunction> = F extends (this: infer This, ...args: infer Args) => Promise ? ((this: This, ...args: Args) => Promise) & { isExecuting: boolean; } : never; /** * 创建一个有执行状态的函数,该函数在前一次调用未完成时不会被再次调用。 * * 前一次还没结束时,后来的调用**立刻**返回 {@link RealUndefined}, * 既不等待也不执行。被包装的函数在同一时刻只会跑一份。 * * ## 与 {@link singleFlight} 怎么选 * * 分水岭是**后来的调用方要不要结果**: * 不要、且希望它立刻脱身 → 本函数;要结果 → `singleFlight`。 * * 本函数独有、`singleFlight` 表达不了的三点: * * - **`minTime`**:任务结束后仍锁定一段时间,用于防连点、保证 loading * 最短展示时长这类需求。 * - **不会级联挂起**:首次调用卡住时,后来者立刻拿到 `RealUndefined` * 脱身,不会陪着一起挂。 * - **能区分「我发起的」**:拿到 `RealUndefined` 就说明这次被挡掉了, * 适合「只有真正发起的那次才弹提示」这类逻辑。 * * 反过来,一次失败**不会**传播给被挡掉的调用方;需要所有调用方都感知 * 成败时应当用 `singleFlight`。 * * 注意本函数是「丢弃」而非「合并尾部」:进行中被丢掉的那次触发不会在 * 结束后补跑。若触发本身携带新状态(当前这次跑的是旧状态),丢弃会让 * 新状态永久丢失,这种场景两者都不适用。 * * @param func - 需要包裹的函数。同步抛出的异常会转成 rejected Promise, * 并正常释放执行状态。 * @param minTime - 最短锁定时长(毫秒)。任务快于该时长时, * `isExecuting` 会保持到满足时长为止。默认 0,即结束即释放。 * @returns 一个增强版的函数,该函数具有 isExecuting 属性。 */ export declare function singleExecutionWrapper>(func: T, minTime?: number): SingleExecutionFunction;