如何过滤RXJS ArrayObservable?

时间:2015-12-17 19:04:54

标签: angular rxjs

我有一个我想要过滤的数组..听起来很简单我知道。 但是当我这样做时,我仍然得到整个阵列......

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);我得到整个数组而不是单个数组成员的流,为什么?

这是debug snap:

enter image description here

我知道我并不疯狂,因为这可以按预期工作:

 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用于阅读,

肖恩。

1 个答案:

答案 0 :(得分:13)

您需要使用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)但是想要处理新闻中包含的实际值(不在包含它们的observable上) )。这有点像连接数组和将其添加为元素之间的区别。

另一种有效的方法是使用像之前一样的地图,但合并发射的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);
  });
}

如果您不理解任何这一点,请不要担心,people谁能比我更好地解释它:)