|
|
|
|
|
|
|
|
|
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); |
|
} |
|
}; |
|
} |
|
|
|
|
|
export class RequestManager { |
|
private controllers = new Map<string, AbortController>(); |
|
|
|
|
|
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; |
|
} |
|
|
|
|
|
cancelRequest(key: string): void { |
|
const controller = this.controllers.get(key); |
|
if (controller) { |
|
controller.abort(); |
|
this.controllers.delete(key); |
|
} |
|
} |
|
|
|
|
|
cancelAllRequests(): void { |
|
this.controllers.forEach(controller => { |
|
controller.abort(); |
|
}); |
|
this.controllers.clear(); |
|
} |
|
|
|
|
|
isActive(key: string): boolean { |
|
const controller = this.controllers.get(key); |
|
return Boolean(controller && !controller.signal.aborted); |
|
} |
|
} |
|
|