我的后端经常将数据作为数组返回到RxJS 5 Observable中(我正在使用Angular 2).
我经常发现自己想要使用RxJS运算符单独处理数组项,我使用以下代码(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();
mergeMap(val => val)行感觉不是很惯用.
有没有更好的方法将变换应用于由Observable发出的数组成员?
NB.我希望RxJS运算符(vs数组方法)转换我的项目,因为我需要能够将每个项目投影到第二个observable.典型用例:项目ID列表的后端返回,我需要从后端请求所有这些项目.
您可以使用不带任何参数的concatAll()或mergeAll().
dataFromBackend .do(items => console.log(items)) .mergeAll() // or .concatAll()
这(包括mergeMap)仅适用于RxJS 5,因为它以相同的方式处理Observable,数组,类数组对象,Promises等.
最后你也可以这样做:
.mergeMap(val => Observable.from(val) .do(item => console.log(item)) .map(item => item.name) ) .toArray()