rxjs操作符总结

作者 freefish 日期 2018-07-24
rxjs操作符总结

关于rxjs操作符的总结(持续更新中)

级联操作

我的理解,级联操作就是下面的操作流依赖上面的操作。上面如果没有传递值给下面,就会报错。下面流会接收上面操作之后的值。
看例子:

import { Observable } from 'rxjs';

let stream$ = Observable.of(0)
.switchMap(result => {
return Observable.of(result + 1)
})
.switchMap((result) => {
return Observable.of(result + 2);
})
stream$.subscribe((orders) => {
console.log('counter: ', orders);
})

output=> counter: 3

组合操作

组合操作就是把多个Observable合并成一个流。至于合并之后怎么发射值,每个方法是有区别的。组合方法包括: combineLatest、concat、merge、zip。下面我们分别看下他们的用法:

  1. combineLatest
    它表示组合中以最短时间的流为发射点进行发射,而次于最短时间的其他流取他们的最新值一起发射出来。看例子:
    // 测试conbineLatest
    let source1 = Observable.interval(100)
    .map(val => "source1 " + val).take(5);

    let source2 = Observable.interval(50)
    .map(val => "source2 " + val).take(2);

    let stream$ = Observable.combineLatest(
    source1,
    source2
    ).subscribe(data => console.log('conbineLatest: ' + data));

output-> > conbineLatest: source1 0 source2 0
conbineLatest: source1 1 source2 1
conbineLatest: source1 2 source2 1
conbineLatest: source1 3 source2 1
conbineLatest: source1 4 source2 1

  1. concat
    它是严格按照流的顺序执行。第一个流执行完,在发射第二个流。
let source1 = Observable.interval(150)
.map(val => "source1 " + val).take(5);

let source2 = Observable.interval(50)
.map(val => "source2 " + val).take(2);

let stream1 = Observable.concat(source1, source2)
.subscribe((data) => console.log('concat: ' + data));

output:
concat: source1 0
concat: source1 1
concat: source1 2
concat: source1 3
concat: source1 4
concat: source2 0
concat: source2 1

  1. merge
    它合并多个流,每一个流都会按照正常的时序触发。不会受合并影响。看例子:
    let source1 = Observable.interval(150)
    .map(val => "source1 " + val).take(5);

    let source2 = Observable.interval(50)
    .map(val => "source2 " + val).take(2);

    Observable.merge(source1, source2)
    .subscribe((data) => console.log('merge: ' + data));

output:
merge: source2 0
merge: source1 0
merge: source2 1
merge: source1 1
merge: source1 2
merge: source1 3
merge: source1 4

  1. zip
    收集每一个流的一次发射,当每个流都发射之后再触发,如果有任何一个流没有值可以发射了,那么本次触发就舍弃了。例子:
// zip
let stream3 = Observable.zip(
Observable.of(1, 5),
Observable.of(2, 3, 4),
Observable.of(7, 9)
);

let observer3 = {
next: data => console.log('zip: ' + data)
}
stream3.subscribe(observer3);

output:
zip: 1,2,7
zip: 5,3,9

==因为组合之后只能发出两批,所以第二个Observable的4会被舍弃。==