RxJS 笔记 07
1 Marble diagrams
Observable图示
我们把描绘 observable 的图示称为 Marble diagrams
我们用
-
来表达一小段时间,这些 – 串起就代表一个 observable。
----------------
X
(大写 X)则代表有错误发生
---------------X
|
则代表 observable 结束
----------------|
示例
// -----0-----1-----2-----3--...
var source = Rx.Observable.interval(1000);
// (1234)|
var source = Rx.Observable.of(1,2,3,4);
// source: -----0-----1-----2-----3--...
// map(x => x + 1)
// newest: -----1-----2-----3-----4--...
var source = Rx.Observable.interval(1000);
var newest = source.map(x => x + 1);
2 Operator 一个个被附加到 Observable 的函数
RxJS 提供的各种 operators 已经非常够用了,不太需要我们自己创造 operator,
2-1 自定义
示例1
var people = Rx.Observable.of('Jerry', 'Anna');
function map(source, callback) {
return Rx.Observable.create((observer) => {
return source.subscribe(
(value) => {
try{
observer.next(callback(value));
} catch(e) {
observer.error(e);
}
},
(err) => { observer.error(err); },
() => { observer.complete() }
)
})
}
var helloPeople = map(people, (item) => item + ' Hello~');
helloPeople.subscribe(console.log);
// Jerry Hello~
// Anna Hello~
示例2
function map(callback) {
return Rx.Observable.create((observer) => {
return this.subscribe(
(value) => {
try{
observer.next(callback(value));
} catch(e) {
observer.error(e);
}
},
(err) => { observer.error(err); },
() => { observer.complete() }
)
})
}
Rx.Observable.prototype.map = map;
var people = Rx.Observable.of('Jerry', 'Anna');
var helloPeople = people.map((item) => item + ' Hello~');
helloPeople.subscribe(console.log);
// Jerry Hello~
// Anna Hello~
2-2 map, mapTo, filter
map
// source: -----0-----1-----2-----3--...
// map(x => x + 1)
// newest: -----1-----2-----3-----4--...
var source = Rx.Observable.interval(1000);
var newest = source.map(x => x + 2);
newest.subscribe(console.log);
// 2
// 3
// 4
// 5..
mapTo
可以把传进来的值改成一个固定的值
// source: -----0-----1-----2-----3--...
// mapTo(2)
// newest: -----2-----2-----2-----2--...
var source = Rx.Observable.interval(1000);
var newest = source.mapTo(2);
newest.subscribe(console.log);
// 2
// 2
// 2
// 2..
filter
// source: -----0-----1-----2-----3-----4-...
// filter(x => x % 2 === 0)
// newest: -----0-----------2-----------4-...
var source = Rx.Observable.interval(1000);
var newest = source.filter(x => x % 2 === 0);
newest.subscribe(console.log);
// 0
// 2
// 4
// 6..