javascript - Typescript debounce fonksiyonu parametre olarak geçirilen fonksiyonu çağırmıyor
TypeScript ile bir debounce fonksiyonu yazmaya çalışıyorum.
Bunun bir örneğini burada buldum. Kod aşağıdadır:
export function debounce<Params extends any[]>(
func: (...args: Params) => any,
timeout: number,
): (...args: Params) => void {
let timer: NodeJS.Timeout
return (...args: Params) => {
clearTimeout(timer)
timer = setTimeout(() => {
func(...args)
}, timeout)
}
}
Sorun şu ki:
- Parametre olarak geçen fonksiyon, belirtilen zaman aşımından sonra çağrılmıyor
- Lodash veya başka herhangi bir dış kütüphane kullanamıyorum çünkü bu projeye yeni bağımlılıklar eklememeye çalışıyorum.
Teşekkürler.
Cevap #1
debounce işlevinizi nasıl kullanıyorsunuz? Ben bir fiddle hazırladım, çalışan çözümü burada kontrol edebilirsiniz
function debounce<Params extends any[]>(
func: (...args: Params) => any,
timeout: number,
): (...args: Params) => void {
let timer: NodeJS.Timeout
return (...args: Params) => {
clearTimeout(timer)
timer = setTimeout(() => {
func(...args)
}, timeout)
}
}
function test(message) {
alert(message);
}
const debouncedTest = debounce(test, 2000);
debouncedTest('message');
Eh, bu TypeScript sorunları değil
Cevap #2
Bu, Saveli Tomac'ın mükemmel cevabına bir ek olarak tasarlanmıştır.
Yorumlarda bu uygulamanın özellikle iyi olduğunu düşünmediğimi söyledim. Özellikle iki sorunu var:
- Bunun hemen bir seçeneği yok. Yaban hayatta bulunan çoğu debounce uygulamasının (sorunuzda bağlantısını verdiğiniz de dahil) bu özelliği vardır.
- Dönen fonksiyon
thisdeğerini yok sayar.
İşte bunları düzelten bir örnek:
const debounce = (n: number, fn: (...params: any[]) => any, immed: boolean = false) => {
let timer: number | undefined = undefined;
return function (this: any, ...args: any[]) {
if (timer === undefined && immed) {
fn.apply(this, args);
}
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), n);
return timer;
}
};
Typescript Oyun Alanı
