File size: 1,669 Bytes
4c1e4ec |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
/**
* 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);
}
}
|