function createRateLimiter<TFn, TSelected>(
fn,
initialOptions,
selector): SolidRateLimiter<TFn, TSelected>
function createRateLimiter<TFn, TSelected>(
fn,
initialOptions,
selector): SolidRateLimiter<TFn, TSelected>
Definiert in: rate-limiter/createRateLimiter.ts:102
Ein Low-Level Solid-Hook, der eine RateLimiter-Instanz erstellt, um Funktionsausführungen zu begrenzen.
Dieser Hook ist flexibel und zustandsverwaltungsunabhängig konzipiert – er gibt einfach eine Rate-Limiter-Instanz zurück, die Sie mit jeder Zustandsverwaltungslösung (createSignal usw.) integrieren können.
Ratenbegrenzung ist ein einfacher "Hard-Limit"-Ansatz, der Ausführungen erlaubt, bis eine maximale Anzahl innerhalb eines Zeitfensters erreicht ist, und dann alle nachfolgenden Aufrufe blockiert, bis das Fenster zurückgesetzt wird. Im Gegensatz zu Throttling oder Debouncing versucht er nicht, Ausführungen intelligent zu verteilen oder zusammenzufassen.
Der Ratenbegrenzer unterstützt zwei Arten von Fenstern
Für flüssigere 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
• 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();
Ihre wöchentliche Dosis JavaScript-Nachrichten. Jeden Montag kostenlos an über 100.000 Entwickler geliefert.