function createRateLimiter<TFn, TSelected>(
fn,
initialOptions,
selector): SolidRateLimiter<TFn, TSelected>
function createRateLimiter<TFn, TSelected>(
fn,
initialOptions,
selector): SolidRateLimiter<TFn, TSelected>
定义于: rate-limiter/createRateLimiter.ts:102
一个底层的 Solid hook,用于创建 RateLimiter 实例,以强制执行函数执行的速率限制。
此 hook 设计得非常灵活且独立于状态管理——它只返回一个速率限制器实例,您可以将其集成到任何状态管理解决方案中(createSignal 等)。
速率限制是一种简单的“硬限制”方法,它允许在时间窗口内执行直到达到最大计数,然后阻止所有后续调用,直到窗口重置。与节流或防抖不同,它不会尝试智能地间隔或合并执行。
速率限制器支持两种类型的窗口
为了更平滑的执行模式
该 hook 使用 TanStack Store 进行响应式状态管理。 selector 参数允许您指定哪些状态更改将触发重新渲染,通过防止不相关的状态更改发生不必要的重新渲染来优化性能。
默认情况下,不会有响应式状态订阅,您必须通过提供 selector 函数来选择加入状态跟踪。这可以防止不必要的重新渲染,并让您完全控制组件何时更新。只有当您提供 selector 时,组件才会根据所选状态值的变化而重新渲染。
可用的状态属性
• TFn extends AnyFunction
• TSelected = {}
TFn
RateLimiterOptions<TFn>
(state) => TSelected
SolidRateLimiter<TFn, TSelected>
// Default behavior - no reactive state subscriptions
const rateLimiter = createRateLimiter(apiCall, {
limit: 5,
window: 60000,
windowType: 'sliding',
onReject: (rateLimiter) => {
console.log(`Rate limit exceeded. Try again in ${rateLimiter.getMsUntilNextWindow()}ms`);
}
});
// Opt-in to re-render when rate limit state changes (optimized for UI feedback)
const rateLimiter = createRateLimiter(
apiCall,
{ limit: 5, window: 60000 },
(state) => ({
remainingInWindow: state.remainingInWindow,
rejectionCount: state.rejectionCount
})
);
// Opt-in to re-render when execution metrics change (optimized for tracking progress)
const rateLimiter = createRateLimiter(
apiCall,
{ limit: 5, window: 60000 },
(state) => ({
executionCount: state.executionCount,
nextWindowTime: state.nextWindowTime
})
);
// Access the selected state (will be empty object {} unless selector provided)
const { remainingInWindow, rejectionCount } = rateLimiter.state();
// Default behavior - no reactive state subscriptions
const rateLimiter = createRateLimiter(apiCall, {
limit: 5,
window: 60000,
windowType: 'sliding',
onReject: (rateLimiter) => {
console.log(`Rate limit exceeded. Try again in ${rateLimiter.getMsUntilNextWindow()}ms`);
}
});
// Opt-in to re-render when rate limit state changes (optimized for UI feedback)
const rateLimiter = createRateLimiter(
apiCall,
{ limit: 5, window: 60000 },
(state) => ({
remainingInWindow: state.remainingInWindow,
rejectionCount: state.rejectionCount
})
);
// Opt-in to re-render when execution metrics change (optimized for tracking progress)
const rateLimiter = createRateLimiter(
apiCall,
{ limit: 5, window: 60000 },
(state) => ({
executionCount: state.executionCount,
nextWindowTime: state.nextWindowTime
})
);
// Access the selected state (will be empty object {} unless selector provided)
const { remainingInWindow, rejectionCount } = rateLimiter.state();
您的每周 JavaScript 资讯。每周一免费发送给超过 10 万开发者。