2015-12-17 7 views
12

Ich habe ein Array, das ich gerne filtern würde .. klingt einfach ich weiß. Aber wenn ich das tue, habe ich noch das gesamte Array erhalten ...Wie zu filtern 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); 
    }); 
} 

so in console.log ('alle Array' + Daten); Ich bekomme das gesamte Array anstelle eines Stroms von einzelnen Array-Mitgliedern, warum?

hier ist Debug-Snap:

enter image description here

Ich weiß, ich bin nicht verrückt, weil dies wie erwartet funktioniert:

Rx.Observable.fromArray([1, 2, 3, 4, 5]).filter(function (v) { 
     if (v < 3) 
      return true 
     return false; 
    }).subscribe(function (v) { 
     console.log(v); 
    }) 

was ist passiert?

tx zum Lesen,

Sean.

Antwort

13

Sie müssen concatMap/flatMap oder einen anderen Operator verwenden, der eine Folge von Observablen abflacht.

Ab sofort erhält .filter eher eine Observable als die einzelnen Elemente des Arrays (alles, was Sie tun, ist das Array in eine Observable eines Arrays zu verwandeln. Ihr zweites Beispiel funktioniert, wenn Sie Filter direkt auf diese Observable anwenden).

Versuchen Sie folgendes:

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); 
    }); 
} 

Sie müssen dies tun, da Sie sonst wäre (mit #map) eine beobachtbare von Observablen (Sie geben eine beobachtbare innerhalb des beobachtbaren), sondern wollen auf dem tatsächlichen arbeiten Werte, die in Nachrichten enthalten sind (nicht auf dem Observablen, das sie enthält). Es ist ein bisschen wie der Unterschied zwischen dem Verketten eines Arrays und dem Hinzufügen als Element.

Eine weitere gültige Möglichkeit, dies zu tun wäre mit Karte, wie Sie vorher aber verschmelzenden (Karte flatMap/concatMap nur & Druck in einem Durchgang) die emittierten Observablen

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); 
    }); 
} 

Wenn Sie nicht verstehen, jeder das macht dir keine Sorgen, es gibt people wer kann es besser erklären als ich :)

+0

zuerst danke ... das hat den Trick gemacht, aber lass mich dich fragen, warum brauche ich flatMap, ich komme nur zurück ein einzelnes beobachtbares Rx.Observable.fromArray (Nachrichten) nicht VIEL, also warum müssen wir ein einzelnes Observable flayen (verbinden)? TX !!!!!!!!!!! – born2net

+0

bearbeitet, um Ihre Frage zu beantworten. –