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

