1.Concat
const getPostOne$ = Rx.Observable.timer(3000).mapTo({id: 1});
const getPostTwo$ = Rx.Observable.timer(1000).mapTo({id: 2});
Rx.Observable.concat(getPostOne$, getPostTwo$).subscribe(res => console.log(res));
合並多個observables,當你一次性subscribe的時候,次操作符會合並多個observable的結果到輸出的obserable中。
如果你的關注點在於輸出的順序的情況下,可以使用此操作符。比如當你需要按順序發送ajax請求的時候可以使用此操作符。
2.forkJoin
forkJoin是Promise.all()方法的Rx版本。
const getPostOne$ = Rx.Observable.timer(1000).mapTo({id: 1});
const getPostTwo$ = Rx.Observable.timer(2000).mapTo({id: 2});
Rx.Observable.forkJoin(getPostOne$, getPostTwo$).subscribe(res => console.log(res))
// 打印[{id: 1}, {id: 2}]
當你需要並發的運行observable的時候使用此操作符。
3.mergeMap
const post$ = Rx.Observable.of({id: 1});
const getPostInfo$ = Rx.Observable.timer(3000).mapTo({title: "Post title"});
const posts$ = post$.mergeMap(post => getPostInfo$).subscribe(res => console.log(res));
首先說下Rx中的兩個術語:
1.source observable 這里指的是post$
2.inner observable 這里指的是getPostInfo$
當inner observable發出值得時候,合並值到輸出的observable中。
4.pairWise
// Tracking the scroll delta Rx.Observable .fromEvent(document, 'scroll') .map(e => window.pageYOffset) .pairwise() .subscribe(pair => console.log(pair)); // pair[1] - pair[0]
把當前的值和上一個值作為數組輸出。如上示例當觸發scroll事件的時候可以輸出[10, 11] [11, 12] [12, 13]...
5.switchMap
const clicks$ = Rx.Observable.fromEvent(document, 'click'); const innerObservable$ = Rx.Observable.interval(1000); clicks$.switchMap(event => innerObservable$) .subscribe(val => console.log(val));
在這個示例中,每當點擊document的時候之前的interval的subscription會被取消並且會開始一個新的值。
6.combineLatest
const clicks$ = Rx.Observable.fromEvent(document, 'click'); const innerObservable$ = Rx.Observable.interval(1000); clicks$.switchMap(event => innerObservable$) .subscribe(val => console.log(val));
如果子流a在等待其他流發射數據期間又發射了新數據而且其他流未發送數據,則使用子流最新發射的數據進行合並。
