map
对 Observable 对象发出的每个值,使用指定的 project 函数,进行映射处理。
var source = Rx.Observable.interval(1000);
var newest = source.map(x => x + 2);
newest.subscribe(console.log);
示例 marble 图:
source: -----0-----1-----2-----3--...
map(x => x + 2)
newest: -----2-----3-----4-----5--...
以上代码运行后,控制台的输出结果:
2
3
4
...
mapTo
对 Observable 对象发出的每个值,映射成固定的值。
var source = Rx.Observable.interval(1000);
var newest = source.mapTo(2);
newest.subscribe(console.log);
示例 marble 图:
source: -----0-----1-----2-----3--...
mapTo(2)
newest: -----2-----2-----2-----2--...
以上代码运行后,控制台的输出结果:
2
2
2
...
scan
对 Observable 发出值,执行 accumulator 指定的运算,可以简单地认为是 Observable 版本的 Array.prototype.reduce 。
var source = Rx.Observable.from('hello')
.zip(Rx.Observable.interval(600), (x, y) => x);
var example = source.scan((origin, next) => origin + next, '');
example.subscribe({
next: (value) => { console.log(value); },
error: (err) => { console.log('Error: ' + err); },
complete: () => { console.log('complete'); }
});
示例 marble 图:
source : ----h----e----l----l----o|
scan((origin, next) => origin + next, '')
example: ----h----(he)----(hel)----(hell)----(hello)|
以上代码运行后,控制台的输出结果:
h
he
hel
hell
hello
complete
(备注:scan 与 reduce 最大的差别就是 scan 最终返回的一定是一个 Observable 对象,而 reduce 的返回类型不是固定的)
buffer
缓冲源 Observable 对象已发出的值,直到 closingNotifier 触发后,才统一输出缓存的元素
var source = Rx.Observable.interval(300);
var source2 = Rx.Observable.interval(1000);
var example = source.buffer(source2);
example.subscribe({
next: (value) => { console.log(value); },
error: (err) => { console.log('Error: ' + err); },
complete: () => { console.log('complete'); }
});
示例 marble 图:
source : --0--1--2--3--4--5--6--7..
source2: ---------0---------1--------...
buffer(source2)
example: ---------([0,1,2])---------([3,4,5])
以上代码运行后,控制台的输出结果:
[0,1,2]
[3,4,5]
[6,7,8]
....
bufferTime
设定源 Observable 对象已发出的值的缓冲时间。
var source = Rx.Observable.interval(300);
var example = source.bufferTime(1000);
example.subscribe({
next: (value) => { console.log(value); },
error: (err) => { console.log('Error: ' + err); },
complete: () => { console.log('complete'); }
});
示例 marble 图:
source : --0--1--2--3--4--5--6--7..
bufferTime(1000)
example: ---------([0,1,2])---------([3,4,5])
以上代码运行后,控制台的输出结果:
[0,1,2]
[3,4,5]
[6,7,8]
....
bufferCount
缓冲源 Observable对象已发出的值,直到大小达到给定的最大 bufferSize 。
ar source = Rx.Observable.interval(300);
var example = source.bufferCount(3);
example.subscribe({
next: (value) => { console.log(value); },
error: (err) => { console.log('Error: ' + err); },
complete: () => { console.log('complete'); }
});
示例 marble 图:
source : --0--1--2--3--4--5--6--7..
bufferCount(3)
example: ---------([0,1,2])---------([3,4,5])
以上代码运行后,控制台的输出结果:
[0,1,2]
[3,4,5]
[6,7,8]
....
concatMap
对每个 Observable 对象发出的值,进行映射处理,并进行合并。该操作符也会先处理前一个 Observable 对象,在处理下一个 Observable 对象。
var source = Rx.Observable.fromEvent(document.body, 'click');
var example = source.concatMap(
e => Rx.Observable.interval(100).take(3));
example.subscribe({
next: (value) => { console.log(value); },
error: (err) => { console.log('Error: ' + err); },
complete: () => { console.log('complete'); }
});
示例 marble 图:
source : -----------c--c------------------...
concatMap(c => Rx.Observable.interval(100).take(3))
example: -------------0-1-2-0-1-2---------...
以上代码运行后,控制台的输出结果:
0
1
2
0
1
2
concatMap 其实就是 map 加上 concatAll 的简化写法。
switchMap
对源 Observable 对象发出的值,做映射处理。若有新的 Observable 对象出现,会在新的 Observable 对象发出新值后,退订前一个未处理完的 Observable 对象。
var source = Rx.Observable.fromEvent(document.body, 'click');
var example = source.switchMap(
e => Rx.Observable.interval(100).take(3));
example.subscribe({
next: (value) => { console.log(value); },
error: (err) => { console.log('Error: ' + err); },
complete: () => { console.log('complete'); }
});
示例 marble 图:
source : -----------c--c-----------------...
concatMap(c => Rx.Observable.interval(100).take(3))
example: -------------0--0-1-2-----------...
以上代码运行后,控制台的输出结果:
0
0
1
2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。