function createRateLimitedSignal<TValue, TSelected>(
value,
initialOptions,
selector?): [Accessor<TValue>, Setter<TValue>, SolidRateLimiter<Setter<TValue>, TSelected>]
function createRateLimitedSignal<TValue, TSelected>(
value,
initialOptions,
selector?): [Accessor<TValue>, Setter<TValue>, SolidRateLimiter<Setter<TValue>, TSelected>]
定义于:rate-limiter/createRateLimitedSignal.ts:95
一个 Solid hook,用于创建一个速率限制的状态值,该状态值强制执行在时间窗口内状态更新的硬限制。此 hook 将 Solid 的 createSignal 与速率限制功能结合起来,提供受控的状态更新。
速率限制是一种简单的“硬限制”方法——它允许所有更新直到达到限制,然后阻止后续更新直到窗口重置。与节流或防抖不同,它不尝试分散或智能地合并更新。这可能导致快速更新的爆发,然后是无更新的时期。
速率限制器支持两种类型的窗口
为了更平滑的更新模式,请考虑使用
速率限制主要用于需要强制执行严格限制的情况,例如 API 速率限制。
该 hook 返回一个元组,包含:
为了在没有状态管理的情况下直接控制速率限制,可以考虑使用更底层的 createRateLimiter hook。
该 hook 使用 TanStack Store 通过底层的 rate limiter 实例进行响应式状态管理。selector 参数允许你指定哪些 rate limiter 状态更改会触发响应式更新,通过防止不必要的订阅(当不相关的状态发生更改时)来优化性能。
默认情况下,将不会有响应式状态订阅,你必须通过提供一个 selector 函数来选择加入状态跟踪。这可以防止不必要的响应式更新,并让你完全控制组件何时订阅状态更改。只有当你提供一个 selector 时,响应式系统才会跟踪选定的状态值。
可用的速率限制器状态属性
• TValue
• TSelected = {}
TValue
RateLimiterOptions<Setter<TValue>>
(state) => TSelected
[Accessor<TValue>, Setter<TValue>, SolidRateLimiter<Setter<TValue>, TSelected>]
// Default behavior - no reactive state subscriptions
const [value, setValue, rateLimiter] = createRateLimitedSignal(0, {
limit: 5,
window: 60000,
windowType: 'sliding'
});
// Opt-in to reactive updates when limit state changes (optimized for UI feedback)
const [value, setValue, rateLimiter] = createRateLimitedSignal(
0,
{ limit: 5, window: 60000 },
(state) => ({ isAtLimit: state.isAtLimit, remainingInWindow: state.remainingInWindow })
);
// With rejection callback and fixed window
const [value, setValue] = createRateLimitedSignal(0, {
limit: 3,
window: 5000,
windowType: 'fixed',
onReject: (rateLimiter) => {
alert(`Rate limit reached. Try again in ${rateLimiter.getMsUntilNextWindow()}ms`);
}
});
// Access rateLimiter state via signals
const handleSubmit = () => {
const remaining = rateLimiter.state().remainingInWindow;
if (remaining > 0) {
setValue(newValue);
} else {
showRateLimitWarning();
}
};
// Default behavior - no reactive state subscriptions
const [value, setValue, rateLimiter] = createRateLimitedSignal(0, {
limit: 5,
window: 60000,
windowType: 'sliding'
});
// Opt-in to reactive updates when limit state changes (optimized for UI feedback)
const [value, setValue, rateLimiter] = createRateLimitedSignal(
0,
{ limit: 5, window: 60000 },
(state) => ({ isAtLimit: state.isAtLimit, remainingInWindow: state.remainingInWindow })
);
// With rejection callback and fixed window
const [value, setValue] = createRateLimitedSignal(0, {
limit: 3,
window: 5000,
windowType: 'fixed',
onReject: (rateLimiter) => {
alert(`Rate limit reached. Try again in ${rateLimiter.getMsUntilNextWindow()}ms`);
}
});
// Access rateLimiter state via signals
const handleSubmit = () => {
const remaining = rateLimiter.state().remainingInWindow;
if (remaining > 0) {
setValue(newValue);
} else {
showRateLimitWarning();
}
};
您的每周 JavaScript 资讯。每周一免费发送给超过 10 万开发者。