我有一个数组,我想过滤..听起来很简单,我知道.但是当我这样做时,我仍然得到整个阵列...
constructor(http:Http) { this._val = Math.random(); let s = http.get('https://secure.digitalsignage.com/Digg'); s.map(s => { let news = JSON.parse(s._body); return Rx.Observable.fromArray(news); }).filter(function(data) { console.log('all array ' + data); return true; }).subscribe(function (v) { console.log(v); }); }
所以在console.log中('all array'+ data); 我得到整个数组而不是单个数组成员的流,为什么?
这是调试快照:
我知道我并不疯狂,因为这可以按预期工作:
Rx.Observable.fromArray([1, 2, 3, 4, 5]).filter(function (v) { if (v < 3) return true return false; }).subscribe(function (v) { console.log(v); })
是什么赋予了?
tx阅读,
肖恩.
您需要使用concatMap/flatMap或任何其他运算符来展平一系列可观察量.
截至目前,.filter接收一个可观察的而不是数组的单个元素(你所做的只是将数组转换为一个数组的可观察数据.你的第二个例子就像你直接对该observable应用过滤器一样).
试试这个:
constructor(http:Http) { this._val = Math.random(); let s = http.get('https://secure.digitalsignage.com/Digg'); s.flatMap(s => { let news = JSON.parse(s._body); return Rx.Observable.fromArray(news); }).filter(function(data) { console.log('all array ' + data); return true; }).subscribe(function (v) { console.log(v); }); }
你需要这样做,否则(使用#map)有一个observable可观察对象(你在observable中返回一个observable)但是想要处理news中包含的实际值(而不是包含它们的observable).这有点像连接数组和将其添加为元素之间的区别.
另一种有效的方法是像以前一样使用map,但合并发出的observable(flatMap/concatMap只需一次映射和合并)
constructor(http:Http) { this._val = Math.random(); let s = http.get('https://secure.digitalsignage.com/Digg'); s.map(s => { let news = JSON.parse(s._body); return Rx.Observable.fromArray(news); }).mergeAll() // here you flatten the observable - i.e. you emit just the values contained in incoming observables and lose the observables themselves .filter(function(data) { console.log('all array ' + data); return true; }).subscribe(function (v) { console.log(v); }); }
如果你不明白这一点不用担心,有人能比我更好地解释:)