La meilleure façon de “aplatir” un tableau à l'intérieur d'un RxJS Observables
Mon backend renvoie souvent données comme un tableau à l'intérieur d'un RxJS 5 Observables (je suis en utilisant Angulaire 2).
Je me retrouve souvent à vouloir processus de la matrice des éléments individuellement avec RxJS opérateurs et je le fais avec le code suivant (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();
La mergeMap(val => val)
ligne ne se sent pas très idiomatique.
Est-il un meilleur moyen pour appliquer des transformations aux membres d'un tableau qui est émis par une Observable?
NB. Je veux RxJS opérateurs (vs les méthodes de tableau) pour transformer mes articles car j'ai besoin de la capacité de projet de chaque élément dans un deuxième observables. Cas d'utilisation typique: "backend" les retours de la liste des identifiants et j'ai besoin de demander à l'ensemble de ces éléments depuis le backend.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
concatAll()
oumergeAll()
sans aucun paramètre.(Y compris
mergeMap
) ne fonctionne que dans RxJS 5 parce qu'il traite les phénomènes Observables, tableaux, tableau comme des objets, des Promesses, etc. de la même manière.Finalement, vous pourriez le faire aussi:
Jan 2019: mise à Jour pour RxJS 6
concatAll()
permettrait de préserver l'ordre des éléments dans le tableau d'origine etmergeAll()
ne serait pas?map(vals => vals.map(item => item.name)
. Pas de supplémentmergeMap, from, toArray
et etc. Devriez-vous faire correspondre à chaque valeur de l'Observable, alors c'est une autre histoire: stackblitz.com/edit/rxjs-xzocbh?file=index.tsEn fait, si vous en avez besoin à l'intérieur du flux d'utiliser seulement ceci:
items => items
. Vous pourriez peut-être diront ce n'est plus "lisible" dans un sens, mais là encore, si vous ne savez pas ceflatMap()
fait à l'époque n'aurait aucun sens. Ils produisent de laObservable<T>
où T est quel que soit le type de pile est.Angulaire 6 note.
Si vous êtes en utilisant, comme un pipeable de l'opérateur, n'est connu que robinet!
https://www.learnrxjs.io/operators/utility/do.html
Ici est un exemple.
Si c'est un fonctionnement synchrone, je suggère d'utiliser du javascript
Array.map
au lieu de cela, il devrait même vous faire économiser de performance: