先讓子彈飛一會兒
,意思是,不要急著去看結果,你給他點時間,他會給你個交代。debounceTime
就像是這樣的道理,趕緊來看看!RxJS
官網的圖可能還是不知其所以然,因此,我在底部加上了時間的部分來做了說明:debounceTime(20)
: 代表當資料發出後的20ms內,都沒有任何資料過來,我就pass。20ms
內都有其他資料發出,因此不被選入。debounce
,需求如下:fromEvent
import { fromEvent, debounceTime } from 'rxjs';
// case: click event + debounceTime
fromEvent(document, 'click').pipe(debounceTime(1000)).subscribe(console.log);
debounceTime
順勢傳遞資料。debounceTime
的使用方式囉!☕需求如下:
input
於HTML
input
輸入資料的時間,是1000ms
: debounceTime
input
輸入一樣的資料,就不傳遞: distinctUntilChanged
HTML
: <input id="input-field" />
<div>
<span>You Type:</span>
<span id="msg"></span>
</div>
JS
:import { fromEvent, debounceTime, map, distinctUntilChanged } from 'rxjs';
// case2: keyup event + debounceTime
const inputField = document.getElementById('input-field');
const msg = document.getElementById('msg');
fromEvent(inputField, 'keyup')
.pipe(
debounceTime(1000), // debounceTime
map((event: KeyboardEvent) => event.target.value), // 取輸入的值
distinctUntilChanged() //<-- 判斷是否重複輸入
)
.subscribe((val) => {
msg.innerHTML = `${val}`;
});
123
並停個一秒,由於是第一筆資料,故資料送出。一秒鐘之內
,輸入4,5
又反悔刪掉,故資料與上一筆一樣,被distinctUntilChanged
過濾掉4,5
,等待個一秒,就被接受啦!import { from, debounceTime } from 'rxjs';
from([1, 2, 3, 4, 5]).pipe(debounceTime(1000)).subscribe(console.log);
debounceTime(Nms)
:捨棄過去的任何資料,僅保留最後一筆且停留N millisecond
的資料。debounceTime
與distinctUntilChanged
(參考day21連結)可以更優化使用者體驗,避免短時間內重複發送事件資料或呼叫API,導致系統效能下降。debounceTime(1000)
也可與debounce(interval(1000))
有一樣的效果喔!完成第22天
,這兩天周末,與好友挑戰了台南的山區,共完成了約175公里
的路程,覺得自己又更清楚目標在哪裡,加油,繼續往更好的自己邁進~ GO。