Должно ли наблюдаемое, испускаемое службой данных, возвращать последовательность объектов или массив объектов? - PullRequest
1 голос
/ 13 июня 2019

Пытаюсь изучить 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: чтобы иметь эквивалент Array.prototype.map() с RxJS 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 голосов
/ 13 июня 2019

Я думаю, это зависит от того, как потребляются данные. Версия 2 - правильный способ думать об этом , если данные, которые вы пытаетесь предоставить через службу, концептуально представляют собой массив элементов .

Подумайте об этом так, если у вас есть служба, которая должна была извлекать 2d-массив (скажем, string[][]), содержащий данные, которые должны отображаться в 2-мерной сетке в пользовательском интерфейсе, тогда было бы целесообразно выставить их через Observable, который испускает один string[][], а не последовательность string, так как это затруднит использование данных.

Вложенное отображение может отличаться от того, к чему вы привыкли, но большинство людей, которые регулярно работают с RxJS, не скажут, что это «странно». На мой взгляд, это никоим образом не читается и очень декларативно. Он сразу говорит мне, что вы применяете преобразование к массиву, который был создан Observable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...