Skip to content

防抖执行

防抖 Hook 区分等待定时器和已开始的请求。都暴露 run(...args): voidcancel(): voidisPending(): booleanrun 不返回可等待的结果;isPending 读取定时器状态,不是请求 loading。

选项 / Hook行为
debounce.delay必填毫秒值,没有默认延迟。
leading / trailing默认 false / true;显式都关闭会在 Hook 执行时抛错。
useDebouncedCallback(callback, options)通过 ref 读取最新回调和选项;新 run 替换等待中的 trailing 定时器并保留最新参数。
useDebouncedExecutePromise / useDebouncedFetcherrun 替换 execute;保留 result/error/reset/abort,Fetcher 还带 exchange。
useDebouncedQuery / useDebouncedFetcherQuery保留 getQuery/setQuery,用 run 替换 execute;当前实现必须显式 autoExecute: true 才自动调度。

同时开启 leading/trailing 时,首次立即调用;孤立的 leading 调用不会额外执行一次 trailing。延迟内的后续调用可以安排 trailing。公开 cancel() 删除计划任务,但保留上次 leading 时间戳,不取消已运行请求;反之,请求 abort() 不清除等待中的定时器,要取消整个用户操作应两者都调用。reset() 只清除结果状态。卸载清除定时器,请求 Hook 还会取消当前执行。

查询变体对响应式 query 做深比较。关闭 autoExecute 或显式设置 query: undefined 会取消自动调度的工作,手动 run 单独处理。替换查询输入不表示立即取消当前网络请求,取消发生在下一次执行开始时。回调异常和 rejected promise 需要对应处理;定时器不会把拒绝交给 run 调用者。异步操作优先使用执行器默认的错误状态处理。

定时器与请求控制

控制待触发定时器正在运行的操作结果状态
cancel()移除继续运行保留
请求变体的 abort()保留发出 abort 并使旧结果失效Idle
请求变体的 reset()保留继续运行当前清空;后续完成仍可能更新
卸载清除请求变体 abort不再提交挂载状态

delay 无默认值。设置 debounce: { delay: 300 } 表示 300 毫秒静默间隔。普通 useQuery 默认自动执行;当前防抖查询实现需要显式 autoExecute: trueisPending() 表示定时器,loading 表示已启动的 supplier;两者均不证明服务端写入被撤销。

完整示例

tsx
import { useDebouncedQuery } from '@ahoo-wang/fetcher-react';
export function Preview() {
  const query = useDebouncedQuery<string, string>({
    initialQuery: '',
    autoExecute: true,
    debounce: { delay: 300 },
    execute: async value => value.toUpperCase(),
  });
  return (
    <section>
      <input aria-label="Text" onChange={e => query.setQuery(e.target.value)} />
      <button
        onClick={() => {
          query.cancel();
          query.abort();
        }}
      >
        Cancel
      </button>
      <output>{query.result}</output>
    </section>
  );
}

公开签名与类型

以下签名按当前根入口可达声明核对。? 表示可省略;泛型/接口只约束编译期,继承项与关联类型可从 符号索引 定位。运行时默认值和失败行为以本页上文为准。

useDebouncedCallback

ts
export function useDebouncedCallback<T extends (...args: any[]) => any>(
  callback: T,
  options: UseDebouncedCallbackOptions,
): UseDebouncedCallbackReturn<T>;

packages/react/src/core/debounced/useDebouncedCallback.ts:87

UseDebouncedCallbackOptions

ts
export interface UseDebouncedCallbackOptions {
  delay: number;
  leading?: boolean;
  trailing?: boolean;
}

packages/react/src/core/debounced/useDebouncedCallback.ts:19

UseDebouncedCallbackReturn

ts
export interface UseDebouncedCallbackReturn<T extends (...args: any[]) => any> {
  readonly run: (...args: Parameters<T>) => void;
  readonly cancel: () => void;
  readonly isPending: () => boolean;
}

packages/react/src/core/debounced/useDebouncedCallback.ts:32

useDebouncedExecutePromise

ts
export function useDebouncedExecutePromise<R = unknown, E = FetcherError>(
  options: UseDebouncedExecutePromiseOptions<R, E>,
): UseDebouncedExecutePromiseReturn<R, E>;

packages/react/src/core/debounced/useDebouncedExecutePromise.ts:119

DebounceCapable

ts
export interface DebounceCapable {
  debounce: UseDebouncedCallbackOptions;
}

packages/react/src/core/debounced/useDebouncedExecutePromise.ts:32

UseDebouncedExecutePromiseOptions

ts
export interface UseDebouncedExecutePromiseOptions<R, E = unknown>
  extends UseExecutePromiseOptions<R, E>, DebounceCapable {}

packages/react/src/core/debounced/useDebouncedExecutePromise.ts:49

UseDebouncedExecutePromiseReturn

ts
export interface UseDebouncedExecutePromiseReturn<R, E = unknown>
  extends
    Omit<UseExecutePromiseReturn<R, E>, 'execute'>,
    UseDebouncedCallbackReturn<UseExecutePromiseReturn<R, E>['execute']> {}

packages/react/src/core/debounced/useDebouncedExecutePromise.ts:60

useDebouncedQuery

ts
export function useDebouncedQuery<Q, R, E = FetcherError>(
  options: UseDebouncedQueryOptions<Q, R, E>,
): UseDebouncedQueryReturn<Q, R, E>;

packages/react/src/core/debounced/useDebouncedQuery.ts:140

UseDebouncedQueryOptions

ts
export interface UseDebouncedQueryOptions<Q, R, E = FetcherError>
  extends UseQueryOptions<Q, R, E>, DebounceCapable {}

packages/react/src/core/debounced/useDebouncedQuery.ts:28

UseDebouncedQueryReturn

ts
export interface UseDebouncedQueryReturn<Q, R, E = FetcherError>
  extends
    Omit<UseQueryReturn<Q, R, E>, 'execute'>,
    UseDebouncedCallbackReturn<UseQueryReturn<Q, R, E>['execute']> {}

packages/react/src/core/debounced/useDebouncedQuery.ts:37

useDebouncedFetcher

ts
export function useDebouncedFetcher<R, E = FetcherError>(
  options: UseDebouncedFetcherOptions<R, E>,
): UseDebouncedFetcherReturn<R, E>;

packages/react/src/fetcher/debounced/useDebouncedFetcher.ts:112

UseDebouncedFetcherOptions

ts
export interface UseDebouncedFetcherOptions<R, E = FetcherError>
  extends UseFetcherOptions<R, E>, DebounceCapable {}

packages/react/src/fetcher/debounced/useDebouncedFetcher.ts:29

UseDebouncedFetcherReturn

ts
export interface UseDebouncedFetcherReturn<R, E = FetcherError>
  extends
    Omit<UseFetcherReturn<R, E>, 'execute'>,
    UseDebouncedCallbackReturn<UseFetcherReturn<R, E>['execute']> {}

packages/react/src/fetcher/debounced/useDebouncedFetcher.ts:40

useDebouncedFetcherQuery

ts
export function useDebouncedFetcherQuery<Q, R, E = FetcherError>(
  options: UseDebouncedFetcherQueryOptions<Q, R, E>,
): UseDebouncedFetcherQueryReturn<Q, R, E>;

packages/react/src/fetcher/debounced/useDebouncedFetcherQuery.ts:145

UseDebouncedFetcherQueryOptions

ts
export interface UseDebouncedFetcherQueryOptions<Q, R, E = FetcherError>
  extends UseFetcherQueryOptions<Q, R, E>, DebounceCapable {}

packages/react/src/fetcher/debounced/useDebouncedFetcherQuery.ts:33

UseDebouncedFetcherQueryReturn

ts
export interface UseDebouncedFetcherQueryReturn<Q, R, E = FetcherError>
  extends
    Omit<UseFetcherQueryReturn<Q, R, E>, 'execute'>,
    UseDebouncedCallbackReturn<UseFetcherQueryReturn<Q, R, E>['execute']> {}

packages/react/src/fetcher/debounced/useDebouncedFetcherQuery.ts:47

相关专题

Fetcher 请求 Hook · Promise 与查询状态 · API Hook 工厂 · 存储与事件订阅 · 安全 Hook 与路由守卫 · Wow 查询 Hook · 监控、ref 与全屏

基于 Apache License 2.0 发布。