web-dev-qa-db-ja.com

RXJS ArrayObservableをフィルタリングする方法?

フィルター処理したい配列があります。しかし、そのときも、配列全体を取得します...

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);個々の配列メンバーのストリームではなく、配列全体を取得しています。なぜですか?

ここにデバッグスナップがあります:

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、

ショーン。

12
born2net

concatMap / flatMap またはオブザーバブルのシーケンスを平坦化するその他の演算子を使用する必要があります。

現在のところ、.filterは配列の個々の要素ではなくオブザーバブルを受け取ります(実行しているのは、配列を配列のオブザーバブルに変換することだけです。2番目の例は、そのオブザーバブルに直接フィルターを適用することで機能します)。

これを試して:

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を使用して)オブザーバブルのオブザーバブル(オブザーバブル内にオブザーバブルを返す)と同じようにこれを行う必要がありますが、ニュース内に含まれる実際の値(それらを含むオブザーバブルではありません)を操作します。これは、配列を連結することと単に要素として追加することの違いに少し似ています。

これを行う別の有効な方法は、以前と同じようにマップを使用することですが、放出されたオブザーバブルをマージします(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 があります:)

13
Niklas Fasching