function useRateLimiter<TFn, TSelected>(
fn,
options,
selector): ReactRateLimiter<TFn, TSelected>
function useRateLimiter<TFn, TSelected>(
fn,
options,
selector): ReactRateLimiter<TFn, TSelected>
Definiert in: react-pacer/src/rate-limiter/useRateLimiter.ts:141
Ein Low-Level-React-Hook, der eine RateLimiter-Instanz erstellt, um Ratenbegrenzungen für die Ausführung von Funktionen durchzusetzen.
Dieser Hook ist darauf ausgelegt, flexibel und zustandsverwaltungsunabhängig zu sein – er gibt einfach eine RateLimiter-Instanz zurück, die Sie mit jeder Zustandsverwaltungslösung integrieren können (useState, Redux, Zustand, Jotai usw.).
Ratenbegrenzung ist ein einfacher "Hard Limit"-Ansatz, der Ausführungen zulässt, bis innerhalb eines Zeitfensters eine maximale Anzahl erreicht ist, und dann alle nachfolgenden Aufrufe blockiert, bis das Fenster zurückgesetzt wird. Im Gegensatz zu Throttling oder Debouncing versucht es nicht, Ausführungen intelligent zu verteilen oder zusammenzuführen.
Der Ratenbegrenzer unterstützt zwei Arten von Fenstern
Für sanftere Ausführungsmuster
Der Hook verwendet TanStack Store für reaktives Zustandsmanagement. Der Parameter selector ermöglicht es Ihnen anzugeben, welche Zustandsänderungen ein erneutes Rendern auslösen, wodurch die Leistung optimiert wird, indem unnötige erneute Renderings verhindert werden, wenn irrelevante Zustandsänderungen auftreten.
Standardmäßig erfolgen keine reaktiven Zustands-Subscriptions und Sie müssen das Zustands-Tracking durch Bereitstellen einer Selector-Funktion aktivieren. Dies verhindert unnötige Renderings und gibt Ihnen die volle Kontrolle darüber, wann Ihre Komponente aktualisiert wird. Nur wenn Sie einen Selector bereitstellen, wird die Komponente neu gerendert, wenn sich die ausgewählten Zustandswerte ändern.
Verfügbare Zustandseigenschaften
Der Hook gibt ein Objekt zurück, das enthält
• TFn extends AnyFunction
• TSelected = {}
TFn
RateLimiterOptions<TFn>
(state) => TSelected
ReactRateLimiter<TFn, TSelected>
// Default behavior - no reactive state subscriptions
const rateLimiter = useRateLimiter(apiCall, {
limit: 5,
window: 60000,
windowType: 'sliding',
});
// Opt-in to re-render when execution count changes (optimized for tracking successful executions)
const rateLimiter = useRateLimiter(
apiCall,
{
limit: 5,
window: 60000,
windowType: 'sliding',
},
(state) => ({ executionCount: state.executionCount })
);
// Opt-in to re-render when rejection count changes (optimized for tracking rate limit violations)
const rateLimiter = useRateLimiter(
apiCall,
{
limit: 5,
window: 60000,
windowType: 'sliding',
},
(state) => ({ rejectionCount: state.rejectionCount })
);
// Opt-in to re-render when execution times change (optimized for window calculations)
const rateLimiter = useRateLimiter(
apiCall,
{
limit: 5,
window: 60000,
windowType: 'sliding',
},
(state) => ({ executionTimes: state.executionTimes })
);
// Multiple state properties - re-render when any of these change
const rateLimiter = useRateLimiter(
apiCall,
{
limit: 5,
window: 60000,
windowType: 'sliding',
},
(state) => ({
executionCount: state.executionCount,
rejectionCount: state.rejectionCount
})
);
// Monitor rate limit status
const handleClick = () => {
const remaining = rateLimiter.getRemainingInWindow();
if (remaining > 0) {
rateLimiter.maybeExecute(data);
} else {
showRateLimitWarning();
}
};
// Access the selected state (will be empty object {} unless selector provided)
const { executionCount, rejectionCount } = rateLimiter.state;
// Default behavior - no reactive state subscriptions
const rateLimiter = useRateLimiter(apiCall, {
limit: 5,
window: 60000,
windowType: 'sliding',
});
// Opt-in to re-render when execution count changes (optimized for tracking successful executions)
const rateLimiter = useRateLimiter(
apiCall,
{
limit: 5,
window: 60000,
windowType: 'sliding',
},
(state) => ({ executionCount: state.executionCount })
);
// Opt-in to re-render when rejection count changes (optimized for tracking rate limit violations)
const rateLimiter = useRateLimiter(
apiCall,
{
limit: 5,
window: 60000,
windowType: 'sliding',
},
(state) => ({ rejectionCount: state.rejectionCount })
);
// Opt-in to re-render when execution times change (optimized for window calculations)
const rateLimiter = useRateLimiter(
apiCall,
{
limit: 5,
window: 60000,
windowType: 'sliding',
},
(state) => ({ executionTimes: state.executionTimes })
);
// Multiple state properties - re-render when any of these change
const rateLimiter = useRateLimiter(
apiCall,
{
limit: 5,
window: 60000,
windowType: 'sliding',
},
(state) => ({
executionCount: state.executionCount,
rejectionCount: state.rejectionCount
})
);
// Monitor rate limit status
const handleClick = () => {
const remaining = rateLimiter.getRemainingInWindow();
if (remaining > 0) {
rateLimiter.maybeExecute(data);
} else {
showRateLimitWarning();
}
};
// Access the selected state (will be empty object {} unless selector provided)
const { executionCount, rejectionCount } = rateLimiter.state;
Ihre wöchentliche Dosis JavaScript-Nachrichten. Jeden Montag kostenlos an über 100.000 Entwickler geliefert.