Loto / src /utils /DebounceUtils.ts
Raí Santos
oi
4c1e4ec
/**
* Utilidades para debounce e throttle
*/
export function debounce<T extends (...args: any[]) => any>(
func: T,
delay: number
): (...args: Parameters<T>) => void {
let timeoutId: NodeJS.Timeout;
return (...args: Parameters<T>) => {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => func(...args), delay);
};
}
export function throttle<T extends (...args: any[]) => any>(
func: T,
delay: number
): (...args: Parameters<T>) => void {
let lastCall = 0;
return (...args: Parameters<T>) => {
const now = Date.now();
if (now - lastCall >= delay) {
lastCall = now;
func(...args);
}
};
}
// Request cancellation manager
export class RequestManager {
private controllers = new Map<string, AbortController>();
// Cancelar request anterior e criar novo
createRequest(key: string): AbortController {
const existing = this.controllers.get(key);
if (existing) {
existing.abort();
}
const controller = new AbortController();
this.controllers.set(key, controller);
return controller;
}
// Cancelar request específico
cancelRequest(key: string): void {
const controller = this.controllers.get(key);
if (controller) {
controller.abort();
this.controllers.delete(key);
}
}
// Cancelar todos os requests
cancelAllRequests(): void {
this.controllers.forEach(controller => {
controller.abort();
});
this.controllers.clear();
}
// Verificar se request está ativo
isActive(key: string): boolean {
const controller = this.controllers.get(key);
return Boolean(controller && !controller.signal.aborted);
}
}