map
操作符实质是以下形式的封装
// transformFn 是一个函数,对数据进行转换操作
function myMap(transformFn) {
var source = this; // 使之变为链式调用的形式
// result 是一个 observable
var result = Rx.Observable.create(function subscribe(observer) {
source.subscribe(
function(x) { observer.next(transformFn(x)); },
function(error) { observer.error(error); },
function() { observer.complete(); }
);
});
return result;
}
Rx.Observable.create
接受一个 参数为 observer
的subscribe函数,然后source
订阅
上面的 var source = this
是为了避免下面的写法,另外还可以实现链式调用
function myMap(source, transformFn) { // ... }
使用 Monkey Patch
的方式将这个方法添加到Rx.Observable
的原型链上
Rx.Observable.prototype.myMap = myMap;
示例:
var source = Rx.Observable.interval(1000);
// 返回一个observable
var result = source.myMap(x => x * 2)
// 订阅
result.subscribe(console.log);
// 打印结果
0
2
4
// ...
网友评论