Rxjs的操作符下篇
分组操作符
-
buffer
buffer(breakObservable) 参数签名
let breakWhen$ = Rx.Observable.timer(1000); let stream$ = Rx.Observable.interval(200).buffer(breakWhen$); stream$.subscribe(value => console.log(value)); // source会缓存所有的值,直到所有的值缓存一次输出 0,1,2,3,4
Buffer意味着我们在等待而不会发出任何值,直到breakObervable发生。
-
bufferTime
基本和buffer的作用是一样的除了参数不一样,buffer传入的参数是BreakObservable。然而bufferTime则是以时间作为参数,作为缓存的触发时机。
高级参数
-
Subject
Subject是一个比较特殊的,它即拥有Observer Observable的行为。
所以Subject即可以订阅数据,也可以发送数据
发送值
subject.next(1); subject.next(2);
订阅值
const subscription = subject.subscribe( (value) => console.log(value) )
Subject的对象拥有以下的方法
- next
- error
- complete
- subscribe
- Unsubcribe
通常我们将Subject用来作为代理来使用
let source$ = Rx.Observable.interval(500).take(3); const proxySubject = new Rx.Subject(); let subscriber = source$.subscribe( proxySubject ); proxySubject.subscribe( (value) => console.log('proxy subscriber', value ) ); proxySubject.next( 3 );
存在一个陷阱: proxySubject在没有被订阅前 所有调用的next方法都是无效的,在订阅之后的值将优先发出。
-
ReplaySubject
ReplaySubject的值与Subject唯一不同在于,subject在没有被订阅前所有的next方法都是无效的,但是replaySubject其实有一个可以设置的缓冲区间。
let replaySubject = new Rx.ReplaySubject(2); replaySubject.next(1); replaySubject.next(2); replaySubject.next(3); replaySubject.subscribe(value => console.log(value))