数据服务发出的可观察对象是否应返回对象序列或对象数组?

时间:2019-06-13 09:58:53

标签: angular rxjs

尝试学习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?

1 个答案:

答案 0 :(得分:0)

我认为这取决于如何使用数据。如果您试图通过服务公开的数据从概念上讲是一组项目,则版本2是正确考虑此问题的正确方法。

以这种方式进行思考,如果您有一个要获取2d数组的服务(假设string[][])包含要在用户界面的2d网格中显示的数据),则公开通过Observable发出一个string[][],而不是string序列,因为它会使数据难以使用。

嵌套映射可能看起来与您习惯的映射不同,但是大多数经常使用RxJS的人不会说这是“怪异”的。在我看来,它绝不是难以理解的,而且是声明性的。它立即对我说,您正在对一个由Observable发出的数组进行转换。