function createAsyncRateLimiter<TFn>(fn, initialOptions): SolidAsyncRateLimiter<TFn>
function createAsyncRateLimiter<TFn>(fn, initialOptions): SolidAsyncRateLimiter<TFn>
定义于:async-rate-limiter/createAsyncRateLimiter.ts:88
一个低级别的 Solid 钩子,用于创建一个 AsyncRateLimiter 实例,以限制异步函数在时间窗口内可以执行的次数。
此钩子设计灵活且与状态管理无关——它仅返回一个速率限制器实例,您可以将其与任何状态管理解决方案(createSignal 等)集成。
速率限制是一种简单的方法,它允许函数在时间窗口内执行达到限制的次数, 然后阻止所有后续调用,直到窗口过去。这可能导致“突发”行为,即所有执行立即发生,然后是完全阻塞。
速率限制器支持两种类型的窗口:
与非异步 RateLimiter 不同,此异步版本支持从速率限制函数返回值, 使其非常适合 API 调用和其他异步操作,在这些操作中,您希望获得 maybeExecute 调用的结果 而不是在速率限制函数内部设置状态变量的结果。
对于更平滑的执行模式,请考虑使用:
速率限制最适合用于硬 API 限制或资源约束。对于 UI 更新或平滑频繁事件,节流或防抖通常提供更好的用户体验。
错误处理:
• TFn extends AnyAsyncFunction
TFn
AsyncRateLimiterOptions<TFn>
// 带返回值的基础 API 调用速率限制
const { maybeExecute } = createAsyncRateLimiter(
async (id: string) => {
const data = await api.fetchData(id);
return data; // 返回值被保留
},
{ limit: 5, window: 1000 } // 每秒 5 次调用
);
// 带状态管理和返回值
const [data, setData] = createSignal(null);
const { maybeExecute } = createAsyncRateLimiter(
async (query) => {
const result = await searchAPI(query);
setData(result);
return result; // 返回值可供调用者使用
},
{
limit: 10,
window: 60000, // 每分钟 10 次调用
onReject: (info) => console.log(`已超出速率限制:距离下一个窗口还有 ${info.nextValidTime - Date.now()} 毫秒`)
}
);
// 带返回值的基础 API 调用速率限制
const { maybeExecute } = createAsyncRateLimiter(
async (id: string) => {
const data = await api.fetchData(id);
return data; // 返回值被保留
},
{ limit: 5, window: 1000 } // 每秒 5 次调用
);
// 带状态管理和返回值
const [data, setData] = createSignal(null);
const { maybeExecute } = createAsyncRateLimiter(
async (query) => {
const result = await searchAPI(query);
setData(result);
return result; // 返回值可供调用者使用
},
{
limit: 10,
window: 60000, // 每分钟 10 次调用
onReject: (info) => console.log(`已超出速率限制:距离下一个窗口还有 ${info.nextValidTime - Date.now()} 毫秒`)
}
);