2015-12-17 13 views
12

Mam tablicę, którą chciałbym filtrować ... brzmi prosto, wiem. Ale kiedy ja, ja wciąż dostać całą macierz ...Jak filtrować 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); 
    }); 
} 

więc w console.log ('wszystko array' + dane); Dostaję całą tablicę zamiast strumienia poszczególnych elementów tablicy, dlaczego?

tutaj jest debug przystawki:

enter image description here

wiem, że nie jestem szalony, bo to działa zgodnie z oczekiwaniami:

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

co daje?

tx do czytania,

Sean.

Odpowiedz

13

Należy użyć concatMap/flatMap lub dowolnego innego operatora, który spłaszcza sekwencję obserwowalnych.

Na razie .filter otrzymuje możliwe do zaobserwowania, a nie pojedyncze elementy tablicy (wszystko, co robisz, zamienia tablicę w tablicę obserwowalną. Twój drugi przykład działa, gdy stosujesz filtr do obserwowalnej bezpośrednio).

Spróbuj tego:

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

Trzeba to zrobić, jak to inaczej (przy użyciu #map) mają zauważalny obserwabli (powrót zauważalny wewnątrz obserwowalne), ale chce pracować na rzeczywiste wartości zawarte w wiadomościach (nie w obserwowalnych zawierających je). Jest to trochę tak, jak różnica między łączeniem macierzy a dodawaniem jej jako elementu.

Kolejny ważny sposób robi to byłoby używając mapy jak przedtem, ale scalanie emitowanych obserwable (flatMap/concatMap tylko map & seryjnej za jednym razem)

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

Jeśli nie rozumiesz o to nie martw się, jest people, który potrafi wyjaśnić to lepiej ode mnie :)

+0

Przede wszystkim dziękuję ... to załatwiło sprawę, ale pozwól, że zapytam Cię, dlaczego potrzebuję skorzystać z FlatMap, tylko wracam pojedyncze obserwowalne Rx.Observable.fromArray (news) nie WIELE, więc dlaczego musimy flay (dołączyć) pojedyncze obserwowalne? TX !!!!!!!!!!! – born2net

+0

edytowane, aby odpowiedzieć na twoje pytanie. –