一个创建异步速率限制函数的类。
速率限制是一种简单的方法,它允许函数在时间窗口内执行达到限制的次数, 然后阻止所有后续调用,直到窗口过去。这可能导致“突发”行为,即所有执行立即发生,然后是完全阻塞。
速率限制器支持两种类型的窗口:
与非异步 RateLimiter 不同,此异步版本支持从速率限制函数返回值, 使其非常适合 API 调用和其他异步操作,在这些操作中,您希望获得 maybeExecute 调用的结果 而不是在速率限制函数内部设置状态变量的结果。
对于更平滑的执行模式,请考虑使用:
速率限制最适合用于硬 API 限制或资源约束。对于 UI 更新或平滑频繁事件,节流或防抖通常提供更好的用户体验。
错误处理:
const rateLimiter = new AsyncRateLimiter(
async (id: string) => await api.getData(id),
{
limit: 5,
window: 1000,
windowType: 'sliding',
onError: (error) => {
console.error('API 调用失败:', error);
},
onReject: (limiter) => {
console.log(`已超出速率限制。请在 ${limiter.getMsUntilNextWindow()} 毫秒后重试`);
}
}
);
// 将立即执行直到达到限制,然后阻塞
// 直接返回 API 响应
const data = await rateLimiter.maybeExecute('123');
const rateLimiter = new AsyncRateLimiter(
async (id: string) => await api.getData(id),
{
limit: 5,
window: 1000,
windowType: 'sliding',
onError: (error) => {
console.error('API 调用失败:', error);
},
onReject: (limiter) => {
console.log(`已超出速率限制。请在 ${limiter.getMsUntilNextWindow()} 毫秒后重试`);
}
}
);
// 将立即执行直到达到限制,然后阻塞
// 直接返回 API 响应
const data = await rateLimiter.maybeExecute('123');
• TFn extends AnyAsyncFunction
new AsyncRateLimiter<TFn>(fn, initialOptions): AsyncRateLimiter<TFn>
new AsyncRateLimiter<TFn>(fn, initialOptions): AsyncRateLimiter<TFn>
TFn
AsyncRateLimiter<TFn>
getEnabled(): boolean
getEnabled(): boolean
返回速率限制器的当前启用状态
boolean
getErrorCount(): number
getErrorCount(): number
返回函数出错的次数
number
getIsExecuting(): boolean
getIsExecuting(): boolean
返回函数当前是否正在执行
boolean
getLimit(): number
getLimit(): number
返回时间窗口内允许的当前执行限制
number
getMsUntilNextWindow(): number
getMsUntilNextWindow(): number
返回距离下一次可能执行的毫秒数 对于固定窗口,这是当前窗口重置之前的时间 对于滑动窗口,这是最旧的执行过期之前的时间
number
getOptions(): AsyncRateLimiterOptions<TFn>
getOptions(): AsyncRateLimiterOptions<TFn>
返回当前速率限制器选项
getRejectionCount(): number
getRejectionCount(): number
返回函数被拒绝的次数
number
getRemainingInWindow(): number
getRemainingInWindow(): number
返回当前窗口中允许的剩余执行次数
number
getSettleCount(): number
getSettleCount(): number
返回函数已完成的次数
number
getSuccessCount(): number
getSuccessCount(): number
返回函数已执行的次数
number
getWindow(): number
getWindow(): number
返���当前时间窗口(以毫秒为单位)
number
maybeExecute(...args): Promise<undefined | ReturnType<TFn>>
maybeExecute(...args): Promise<undefined | ReturnType<TFn>>
如果符合配置的限制,则尝试执行速率限制函数。 如果当前窗口中的调用次数超出限制,则将拒绝执行。 如果允许执行,则在继续之前等待任何先前的执行完成。
错误处理:
...Parameters<TFn>
Promise<undefined | ReturnType<TFn>>
一个 Promise,它解析为函数的返回值,如果发生错误并由 onError 处理,则解析为 undefined
如果未配置 onError 处理程序,则抛出速率限制函数的错误
const rateLimiter = new AsyncRateLimiter(fn, { limit: 5, window: 1000 });
// 前 5 次调用将执行
await rateLimiter.maybeExecute('arg1', 'arg2');
// 窗口内的其他调用将被拒绝
await rateLimiter.maybeExecute('arg1', 'arg2'); // 已拒绝
const rateLimiter = new AsyncRateLimiter(fn, { limit: 5, window: 1000 });
// 前 5 次调用将执行
await rateLimiter.maybeExecute('arg1', 'arg2');
// 窗口内的其他调用将被拒绝
await rateLimiter.maybeExecute('arg1', 'arg2'); // 已拒绝
reset(): void
reset(): void
重置速率限制器状态
void
setOptions(newOptions): void
setOptions(newOptions): void
更新速率限制器选项
Partial<AsyncRateLimiterOptions<TFn>>
void