Mój serwer często zwraca dane w postaci tablicy wewnątrz obiektu RxJS 5 Observable (używam Angular 2).Najlepszy sposób na "spłaszczyć" tablicę wewnątrz obiektu RxJS Observable
I często znajduję się chcąc procesie elementy tablicy indywidualnie z RxJS operatorów i robię to z następującego kodu (JSBin):
const dataFromBackend = Rx.Observable.of([
{ name: 'item1', active: true },
{ name: 'item2', active: false },
{ name: 'item3', active: true }
]);
dataFromBackend
// At this point, the obs emits a SINGLE array of items
.do(items => console.log(items))
// I flatten the array so that the obs emits each item INDIVIDUALLY
.mergeMap(val => val)
// At this point, the obs emits each item individually
.do(item => console.log(item))
// I can keep transforming each item using RxJS operators.
// Most likely, I will project the item into another obs with mergeMap()
.map(item => item.name)
// When I'm done transforming the items, I gather them in a single array again
.toArray()
.subscribe();
Linia mergeMap(val => val)
nie czuje się bardzo idiomatyczne.
Czy istnieje lepszy sposób zastosowania transformacji do elementów tablicy, która jest emitowana przez obserwowalne?
NB. Chcę, aby operatory RxJS (w przeciwieństwie do metod tablicowych) przekształcały moje elementy, ponieważ potrzebuję możliwości rzutowania każdego elementu na drugi obserwowalny. Typowy przypadek użycia: backend zwraca listę identyfikatorów pozycji i muszę zażądać wszystkich tych elementów z zaplecza.
Dzięki, Martin. Czy to prawda, że 'concatAll()' zachowałby kolejność elementów w oryginalnej tablicy, a 'mergeAll()' nie zrobiłby tego? – AngularChef
@AngularFrance Ponieważ rozpakowujesz tablicę, nie ma znaczenia, którego z nich użyjesz, a obie będą produkować zamówione przedmioty. Jest to istotne tylko wtedy, gdy jest używane z operacją asynchroniczną, co nie jest w tym przypadku. – martin