sampleTime
。emits whichever value it has most recently emitted since the previous sampling
,每次取樣都會從上一個區間內,抓取最新的值發送。import { interval, sampleTime, take } from 'rxjs';
// case1: basis
interval(1000).pipe(sampleTime(1000), take(5)).subscribe(console.log);
// 依序印出 0, 1, 2, 3, 4
sampleTime
同樣固定每秒抓取一個值,得到0, 1, 2, 3, 4
。import { fromEvent, map, sampleTime, tap } from 'rxjs';
console.log('=== case2:click event + sampleTime ===');
const clicks = fromEvent(document, 'click');
const result = clicks.pipe(
map((event: MouseEvent) => {
return { x: event.clientX, y: event.clientY };
}),
tap((d) => console.log(d)),
sampleTime(3000)
);
result.subscribe((d) => console.log('--->', d));
每3秒鐘取樣一次
,在這中間的過程中,我們任意點擊,你會發現,sampleTime
只傳遞最後一筆資料。sampleTime
是取最新的值,那不就跟debounceTime
一樣了嗎?debounceTime
: 當資料來時觸發,等到設定的時間內都沒有資料時,傳遞資料。sampleTime
: 規律性持續觸發,觸發時會根據observable
中暫存的最新值,選擇來傳遞。throttleTime
: 當資料來時觸發,取第一個資料傳遞,設定的時間區間內若有其他資料,均被丟棄。sample(notifier)
:簡單來說,就是透過一個observable型態的notifier
來觸發取樣:例如:我們宣告
click$
為一個notifier
,當我點擊的時候,觸發sample
,先來看個例子。
import { fromEvent, map, sampleTime, interval, take, tap, sample } from 'rxjs';
console.log('=== case3: click to trig sample to check current time ===');
const click$ = fromEvent(document, 'click');
// === show interval ===
interval(1000)
.pipe(
tap((d) => console.log(d)), //<-- 顯示幕前的秒數
take(50), //<-- 最多計數到50
sample(click$) //<-- click觸發sample
)
.subscribe((d) => {
console.log('click on ', d, 'sec');
});
click
,也就是notifier
,就會觸發sample
進行取樣當前的秒數。sampleTime
:固定時間進行observable
的資料取樣(從上一個區間內,抓取最新的值發送)。sample(notifier)
: notifier
觸發observable
資料取樣。
notifier
: 為一個observable