function rateLimit<TFn>(fn, initialOptions): (...args) => boolean
function rateLimit<TFn>(fn, initialOptions): (...args) => boolean
创建一个速率限制函数,该函数将在时间窗口内执行提供的函数达到最大次数。
请注意,与节流或防抖相比,速率限制是一种更简单的执行控制形式:
速率限制器支持两种类型的窗口:
如果需要更智能的执行控制,请考虑使用 throttle() 或 debounce()。当您特别需要强制执行时间段内执行次数的硬限制时,请使用速率限制。
• TFn extends AnyFunction
TFn
RateLimiterOptions<TFn>
Function
如果符合配置的限制,则尝试执行速率限制函数。 如果当前窗口中的调用次数超出限制,则将拒绝执行。
...Parameters<TFn>
boolean
const rateLimiter = new RateLimiter(fn, { limit: 5, window: 1000 });
// 前 5 次调用将返回 true
rateLimiter.maybeExecute('arg1', 'arg2'); // true
// 窗口内的其他调用将返回 false
rateLimiter.maybeExecute('arg1', 'arg2'); // false
const rateLimiter = new RateLimiter(fn, { limit: 5, window: 1000 });
// 前 5 次调用将返回 true
rateLimiter.maybeExecute('arg1', 'arg2'); // true
// 窗口内的其他调用将返回 false
rateLimiter.maybeExecute('arg1', 'arg2'); // false
// 滑动窗口内每分钟限制 5 次调用
const rateLimited = rateLimit(makeApiCall, {
limit: 5,
window: 60000,
windowType: 'sliding',
onReject: (rateLimiter) => {
console.log(`已超出速率限制。请在 ${rateLimiter.getMsUntilNextWindow()} 毫秒后重试`);
}
});
// 前 5 次调用将立即执行
// 其他调用将被拒绝,直到分钟窗口重置
rateLimited();
// 要获得更均匀的执行,请考虑改用节流:
const throttled = throttle(makeApiCall, { wait: 12000 }); // 每 12 秒调用一次
// 滑动窗口内每分钟限制 5 次调用
const rateLimited = rateLimit(makeApiCall, {
limit: 5,
window: 60000,
windowType: 'sliding',
onReject: (rateLimiter) => {
console.log(`已超出速率限制。请在 ${rateLimiter.getMsUntilNextWindow()} 毫秒后重试`);
}
});
// 前 5 次调用将立即执行
// 其他调用将被拒绝,直到分钟窗口重置
rateLimited();
// 要获得更均匀的执行,请考虑改用节流:
const throttled = throttle(makeApiCall, { wait: 12000 }); // 每 12 秒调用一次