框架
版本
防抖器 API 参考
节流器 API 参考
速率限制器 API 参考
队列 API 参考
批处理器 API 参考

createAsyncThrottler

函数: createAsyncThrottler()

ts
function createAsyncThrottler<TFn, TSelected>(
   fn, 
   initialOptions, 
selector): SolidAsyncThrottler<TFn, TSelected>
function createAsyncThrottler<TFn, TSelected>(
   fn, 
   initialOptions, 
selector): SolidAsyncThrottler<TFn, TSelected>

定义于: async-throttler/createAsyncThrottler.ts:117

一个底层的 Solid hook,用于创建一个 AsyncThrottler 实例,以限制异步函数的执行频率。

此 hook 的设计非常灵活且与状态管理无关——它仅仅返回一个节流器实例,您可以将其集成到任何状态管理解决方案中(createSignal 等)。

异步节流确保一个异步函数在指定的时间窗口内最多执行一次,无论它被调用多少次。这对于限制昂贵的 API 调用、数据库操作或其他异步任务的速率非常有用。

与非异步节流器不同,此异步版本支持从节流函数返回值的,使其成为 API 调用和其他异步操作的理想选择,因为您希望从 maybeExecute 调用中获取结果,而不是在节流函数内部将结果设置到状态变量中。

错误处理

  • 如果提供了 onError 处理程序,它将与错误和节流器实例一起被调用
  • 如果 throwOnError 为 true(当没有提供 onError 处理程序时的默认值),错误将被抛出
  • 如果 throwOnError 为 false(当提供 onError 处理程序时的默认值),错误将被吞没
  • onError 和 throwOnError 可以一起使用 - 在任何错误被抛出之前,处理程序都会被调用
  • 错误状态可以通过底层 AsyncThrottler 实例进行检查

状态管理和选择器

该 hook 使用 TanStack Store 进行响应式状态管理。 selector 参数允许您指定哪些状态更改将触发重新渲染,通过防止不相关的状态更改导致不必要的重新渲染来优化性能。

默认情况下,不会有响应式状态订阅,您必须通过提供 selector 函数来选择加入状态跟踪。这可以防止不必要的重新渲染,并让您完全控制组件何时更新。只有当您提供 selector 时,组件才会在选定的状态值发生变化时重新渲染。

可用的状态属性

  • canLeadingExecute: 节流器是否可以在前沿执行
  • canTrailingExecute: 节流器是否可以在后沿执行
  • executionCount: 已完成的函数执行次数
  • hasError: 上次执行是否导致错误
  • isPending:节流器是否正在等待超时触发执行
  • isExecuting: 当前是否有异步函数执行正在进行中
  • lastArgs: Последний вызов maybeExecute 的参数
  • lastError: 最近一次失败执行的错误(如果有)
  • lastExecutionTime: 上次执行的时间戳
  • lastResult: 最近一次成功执行的结果
  • nextExecutionTime: 下次允许执行的时间戳
  • status: 当前执行状态('disabled' | 'idle' | 'pending' | 'executing')

类型参数

TFn extends AnyAsyncFunction

TSelected = {}

参数

fn

TFn

initialOptions

AsyncThrottlerOptions<TFn>

选择器

(state) => TSelected

Returns (返回)

SolidAsyncThrottler<TFn, TSelected>

示例

tsx
// Default behavior - no reactive state subscriptions
const { maybeExecute } = createAsyncThrottler(
  async (id: string) => {
    const data = await api.fetchData(id);
    return data;
  },
  { wait: 1000 }
);

// Opt-in to re-render when isPending or isExecuting changes (optimized for loading states)
const throttler = createAsyncThrottler(
  async (query) => {
    const result = await searchAPI(query);
    return result;
  },
  { wait: 2000 },
  (state) => ({ isPending: state.isPending, isExecuting: state.isExecuting })
);

// Opt-in to re-render when error state changes (optimized for error handling)
const throttler = createAsyncThrottler(
  async (query) => {
    const result = await searchAPI(query);
    return result;
  },
  {
    wait: 2000,
    leading: true,   // Execute immediately on first call
    trailing: false, // Skip trailing edge updates
    onError: (error) => {
      console.error('API call failed:', error);
    }
  },
  (state) => ({ hasError: state.hasError, lastError: state.lastError })
);

// Access the selected state (will be empty object {} unless selector provided)
const { isPending, isExecuting } = throttler.state();
// Default behavior - no reactive state subscriptions
const { maybeExecute } = createAsyncThrottler(
  async (id: string) => {
    const data = await api.fetchData(id);
    return data;
  },
  { wait: 1000 }
);

// Opt-in to re-render when isPending or isExecuting changes (optimized for loading states)
const throttler = createAsyncThrottler(
  async (query) => {
    const result = await searchAPI(query);
    return result;
  },
  { wait: 2000 },
  (state) => ({ isPending: state.isPending, isExecuting: state.isExecuting })
);

// Opt-in to re-render when error state changes (optimized for error handling)
const throttler = createAsyncThrottler(
  async (query) => {
    const result = await searchAPI(query);
    return result;
  },
  {
    wait: 2000,
    leading: true,   // Execute immediately on first call
    trailing: false, // Skip trailing edge updates
    onError: (error) => {
      console.error('API call failed:', error);
    }
  },
  (state) => ({ hasError: state.hasError, lastError: state.lastError })
);

// Access the selected state (will be empty object {} unless selector provided)
const { isPending, isExecuting } = throttler.state();
我们的合作伙伴
Code Rabbit
Unkey
订阅 Bytes

您的每周 JavaScript 资讯。每周一免费发送给超过 10 万开发者。

Bytes

无垃圾邮件。您可以随时取消订阅。

订阅 Bytes

您的每周 JavaScript 资讯。每周一免费发送给超过 10 万开发者。

Bytes

无垃圾邮件。您可以随时取消订阅。