debounceTime
,當事件觸發後,如果這一段時間都沒有任何事件進來,我就會選擇這筆資料。throttleTime
的概念則是,當事件觸發後,這筆資料會馬上被選擇,而這段期間任何輸入的事件資料,都會被忽略。
圖片來源-RxJS Marbles-throttleTime
duration time = 25ms
期間內的所有資料,都被丟棄。import { fromEvent, throttleTime, tap, map } from 'rxjs';
const keyup$ = fromEvent(document, 'keyup');
keyup$
.pipe(
map((event: KeyboardEvent) => event.code), // 取keycode
tap((code) => console.log(code)), // 顯示使用者輸入的keycode
throttleTime(2000) // throttleTime
)
.subscribe((code) => console.log('===>throttle:', code));
key值
,你可以發現,throttleTime
會將第一個事件的key值
送出,過程中任何被觸發的值都會被丟棄。throttleTime
相當適合拿來設計:throttleTime
就能優化囉!先來看原始的設計,每次捲動一格,scroll事件就會被觸發一次!相當耗費效能。
利用
throttleTime
來降低取樣頻率,讓效能提升!
當事件觸發後,等待一段時間沒有資料近來,
debounceTime
才會將這筆資料往後傳遞。
因此,當使用者停下scroll動作,等待一段時間才會送出百分比。
throttleTime
及debounceTime
都相當適合拿來 減少高頻取樣 的設計。throttleTime
: 當事件觸發後,這筆資料會馬上被選擇,而這段期間任何輸入的事件資料,都會被忽略。適合與動畫、拖曳或scroll結合。
debounceTime
:當事件觸發後,如果這一段時間都沒有任何事件進來,我就會選擇這筆資料。適合拿來判斷使用者是否高頻率的輸入(keyup)或點擊(click)。
throttleTime
有許多眉角需要釐清,相信是值得的~ 繼續fighting!!