尝试学习Angular和RxJS,我对数据服务应该返回什么感到有些困惑。对象序列还是对象数组?最佳做法是什么?
import { from, of } from 'rxjs';
import {map, toArray} from 'rxjs/operators';
const items = [
{id: 1, name: "foo"},
{id: 2, name: "bar"}
];
// "Standard" map behaviour going throuch each item of the array
const names = items.map( item => item );
版本1:
与RxJS Array.prototype.map()
等效于map
,我将使用一系列对象:
// I can go directly through the items using map and then use toArray()
const version1 = from(items).pipe(
map(item => item),
toArray(),
).subscribe(
name => console.log('version1', item)
);
版本2: 要对发射对象数组的Observable执行相同操作:
const version2 = of(items).pipe(
map(items => items.map( item => item)) // weird nested mapping
).subscribe(
item => console.log('version2', item)
);
版本2看起来很奇怪,因为我必须做一个“嵌套”地图才能浏览我的物品。
由于Angular HttpClient get()
方法确实返回了对象数组,因此我应该使用版本2,但是使用它并不“自然”。无论如何,我都必须以一个对象数组结束...
那么,版本1还是版本2?
答案 0 :(得分:0)
我认为这取决于如何使用数据。如果您试图通过服务公开的数据从概念上讲是一组项目,则版本2是正确考虑此问题的正确方法。
以这种方式进行思考,如果您有一个要获取2d数组的服务(假设string[][])
包含要在用户界面的2d网格中显示的数据),则公开通过Observable发出一个string[][]
,而不是string
序列,因为它会使数据难以使用。
嵌套映射可能看起来与您习惯的映射不同,但是大多数经常使用RxJS的人不会说这是“怪异”的。在我看来,它绝不是难以理解的,而且是声明性的。它立即对我说,您正在对一个由Observable发出的数组进行转换。