Javascript
的Array
提供一個可累加蒐集資料的函示~ reduce
,今天我們要介紹的RxJS reduce
也是一樣的概念,趕緊來看個例子吧!console.log('=== Case1: JS Array.reduce() ===');
const func = (accum, current) => accum + current;
const result = [1, 2, 3, 4, 5].reduce(func, 0);
console.log(result);
console.log('=== Case2: RxJS reduce() ===');
import { from, reduce } from 'rxjs';
const myReduce$ = from([1, 2, 3, 4, 5])
.pipe(
reduce(func, 0) //<-- RxJS reduce
)
.subscribe(console.log);
從reduce的marble diagram來看,累加到最後一個值才會發出訊息,相當的盡責。
inteval
,我們使用它固定時間發出一個訊號的特性,來驗證看看reduce
是不是很盡責的一直做下去!import { interval, reduce, take } from 'rxjs';
const accumFunc = (accum, current) => accum + current;
const myReduce$ = interval(1000).pipe(
reduce(accumFunc, 0)
);
myReduce$.subscribe({
next: (val) => console.log(val), //<-- 因為interval沒有一個結束的方式,故reduce會一直呼叫next()
complete: () => console.log('completed!'), // <-- complete()不會被呼叫
});
complete()
不會被呼叫,因為 interval沒有一個結束的方式,故reduce會一直呼叫next()。take(3)
來限制一下它,代表說 ~ 你取3個值計算就可以下班了
import { interval, reduce, take } from 'rxjs';
const accumFunc = (accum, current) => accum + current;
const myReduce$ = interval(1000).pipe(
take(3), //<-- 加take(3)來限制interval
reduce(accumFunc, 0)
);
...
reduce
都不會主動呼叫next()
,很認份,很盡責!reduce
與Array.reduce()
的用法一致。reduce
直到最後一個值處理完,才會呼叫complete()
。interval
,會一直做到天荒地老,除非我們用take
去限制observable
送出的次數。