TypeScript實(shí)用的Delay延遲執(zhí)行工具類
在前端開發(fā)中,我們經(jīng)常需要處理一些延遲執(zhí)行、防抖和節(jié)流的場景。今天介紹一個(gè)實(shí)用的Delay
工具類,它提供了這些常用的延遲執(zhí)行功能。
0、完整代碼
/** * 延遲執(zhí)行工具類 */ export class Delay { /** * 延遲指定時(shí)間 * @param ms 延遲的毫秒數(shù) * @returns Promise對象 */ static sleep(ms: number): Promise<void> { return new Promise(resolve => setTimeout(resolve, ms)); } /** * 延遲執(zhí)行函數(shù) * @param fn 要執(zhí)行的函數(shù) * @param ms 延遲的毫秒數(shù) * @returns Promise對象,包含函數(shù)執(zhí)行結(jié)果 */ static async execute<T>(fn: () => T | Promise<T>, ms: number): Promise<T> { await this.sleep(ms); return await fn(); } /** * 創(chuàng)建防抖函數(shù) * @param fn 要執(zhí)行的函數(shù) * @param ms 延遲時(shí)間 * @returns 防抖后的函數(shù) */ static debounce<T extends (...args: any[]) => any>(fn: T, ms: number): (...args: Parameters<T>) => void { let timeoutId: NodeJS.Timeout; return function (...args: Parameters<T>) { clearTimeout(timeoutId); timeoutId = setTimeout(() => fn.apply(this, args), ms); }; } /** * 創(chuàng)建節(jié)流函數(shù) * @param fn 要執(zhí)行的函數(shù) * @param ms 間隔時(shí)間 * @returns 節(jié)流后的函數(shù) */ static throttle<T extends (...args: any[]) => any>(fn: T, ms: number): (...args: Parameters<T>) => void { let isThrottled = false; return function (...args: Parameters<T>) { if (!isThrottled) { fn.apply(this, args); isThrottled = true; setTimeout(() => isThrottled = false, ms); } }; } }
1. 基礎(chǔ)延遲執(zhí)行
sleep方法
sleep方法提供了一個(gè)簡單的延遲執(zhí)行功能:
// 延遲2秒 await Delay.sleep(2000); console.log('2秒后執(zhí)行'); // 在async函數(shù)中使用 async function demo() { console.log('開始'); await Delay.sleep(1000); console.log('1秒后'); }
execute方法
execute方法可以延遲執(zhí)行一個(gè)函數(shù):
// 延遲3秒執(zhí)行函數(shù) const result = await Delay.execute(() => { return '延遲執(zhí)行的結(jié)果'; }, 3000); // 異步函數(shù)示例 await Delay.execute(async () => { const response = await fetch('https://api.example.com/data'); return response.json(); }, 1000);
2. 防抖(Debounce)
防抖是指在短時(shí)間內(nèi)多次觸發(fā)同一個(gè)函數(shù),只執(zhí)行最后一次。典型場景包括:
- 搜索框輸入
- 窗口調(diào)整
- 按鈕點(diǎn)擊
實(shí)現(xiàn)原理
每次觸發(fā)時(shí)都會(huì)清除之前的定時(shí)器,重新設(shè)置一個(gè)新的定時(shí)器,確保只有在指定時(shí)間內(nèi)沒有新的觸發(fā)時(shí)才執(zhí)行函數(shù)。
使用示例
// 創(chuàng)建防抖函數(shù) const debouncedSearch = Delay.debounce((searchTerm: string) => { console.log('搜索:', searchTerm); }, 500); // 在輸入框onChange事件中使用 <input onChange={(e) => debouncedSearch(e.target.value)} /> // 窗口調(diào)整示例 const debouncedResize = Delay.debounce(() => { console.log('窗口大小改變'); }, 200); window.addEventListener('resize', debouncedResize);
3. 節(jié)流(Throttle)
節(jié)流是指在一定時(shí)間間隔內(nèi)只執(zhí)行一次函數(shù),無論這個(gè)函數(shù)被調(diào)用多少次。典型場景包括:
- 滾動(dòng)事件處理
- 頻繁點(diǎn)擊
- 游戲中的射擊
實(shí)現(xiàn)原理
通過一個(gè)標(biāo)志位控制函數(shù)執(zhí)行,在指定時(shí)間間隔內(nèi),該標(biāo)志位為true時(shí)阻止函數(shù)執(zhí)行,時(shí)間到后將標(biāo)志位設(shè)為false允許下次執(zhí)行。
使用示例
// 創(chuàng)建節(jié)流函數(shù) const throttledScroll = Delay.throttle(() => { console.log('頁面滾動(dòng)'); }, 200); // 在滾動(dòng)事件中使用 window.addEventListener('scroll', throttledScroll); // 游戲射擊示例 const throttledShoot = Delay.throttle(() => { console.log('發(fā)射子彈'); }, 1000); button.addEventListener('click', throttledShoot);
防抖和節(jié)流的區(qū)別
防抖(Debounce):
- 多次觸發(fā),只執(zhí)行最后一次
- 適合輸入框?qū)崟r(shí)搜索等場景
- 重在清除之前的定時(shí)器
節(jié)流(Throttle):
- 一定時(shí)間內(nèi)只執(zhí)行一次
- 適合滾動(dòng)事件、頻繁點(diǎn)擊等場景
- 重在控制執(zhí)行頻率
總結(jié)
這個(gè)Delay工具類提供了四個(gè)實(shí)用的方法:
- sleep: 基礎(chǔ)延遲
- execute: 延遲執(zhí)行函數(shù)
- debounce: 創(chuàng)建防抖函數(shù)
- throttle: 創(chuàng)建節(jié)流函數(shù)
通過合理使用這些方法,可以有效控制函數(shù)的執(zhí)行時(shí)機(jī),優(yōu)化性能,提升用戶體驗(yàn)。在實(shí)際開發(fā)中,要根據(jù)具體場景選擇合適的方法使用。
到此這篇關(guān)于TypeScript實(shí)用的Delay延遲執(zhí)行工具類的文章就介紹到這了,更多相關(guān)TypeScript延遲執(zhí)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用Javascript評估用戶輸入密碼的強(qiáng)度(Knockout版)
早上看到博友6點(diǎn)多發(fā)的一篇關(guān)于密碼強(qiáng)度的文章(連接),甚是感動(dòng)(周末大早上還來發(fā)文)2011-11-11輕松實(shí)現(xiàn)HTML和JS之間的轉(zhuǎn)化的代碼
輕松實(shí)現(xiàn)HTML和JS之間的轉(zhuǎn)化的代碼...2007-09-09JavaScript實(shí)現(xiàn)向右伸出的多級網(wǎng)頁菜單效果
這篇文章主要介紹了JavaScript實(shí)現(xiàn)向右伸出的多級網(wǎng)頁菜單效果,通過javascript調(diào)用頁面元素屬性的動(dòng)態(tài)改變實(shí)現(xiàn)向右展開菜單效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08JavaScript判斷是否為數(shù)字的多種方法小結(jié)
這篇文章主要介紹了JavaScript判斷是否為數(shù)字的多種方法小結(jié),本文給大家分享三種方法,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01layer關(guān)閉當(dāng)前窗口頁面以及確認(rèn)取消按鈕的方法
今天小編就為大家分享一篇layer關(guān)閉當(dāng)前窗口頁面以及確認(rèn)取消按鈕的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09