Куда поместить бизнес-логику, предназначенную для преобразования данных, предназначенных для хранилища ngrx: в эффекты или редюсеры?

Мой вопрос касается эффектов и редьюсеров ngrx.

Мне нужно преобразовать данные, полученные из серверной части, прежде чем помещать их в хранилище ngrx. Данные, полученные из серверной части, представляют собой простой массив Message (Message — это пользовательский тип в моем приложении):

Message[]

Мне нужно преобразовать массив в следующее:

Map<string, Message[]>

В основном я группирую сообщения пользователя по идентификатору контрагента (получателя или отправителя) (ключу).

Я не уверен, где выполнить преобразование из Message[] в Map<string, Message[]>: должен ли я поместить бизнес-логику преобразования в @Effect или в функции редьюсера?


person balteo    schedule 14.03.2017    source источник


Ответы (3)


Преобразование может идти либо в эффект, либо в редуктор.

Если бы нужно было выполнить какую-либо проверку, я бы поместил ее в эффект, где у меня была бы возможность отправить действие с ошибкой.

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

Есть и другой вариант: вы можете использовать селектор. То есть сообщения можно хранить в состоянии в виде простого массива, а селектор можно использовать для преобразования сообщений состояния, группируя их по контрагенту или как-то еще. Если бы у меня было несколько способов группировки сообщений, я бы выбрал именно этот вариант.

@ngrx/example-app содержит несколько примеров селекторов :

/**
 * A selector function is a map function factory. We pass it parameters and it
 * returns a function that maps from the larger state tree into a smaller
 * piece of state. This selector simply selects the `books` state.
 *
 * Selectors are used with the `select` operator.
 *
 * ```ts
 * class MyComponent {
 *  constructor(state$: Observable<State>) {
 *    this.booksState$ = state$.select(getBooksState);
 *  }
 * }
 * ```
 */
export const getBooksState = (state: State) => state.books
person cartant    schedule 14.03.2017
comment
Добавлена ​​еще одна опция: селектор. - person cartant; 14.03.2017

Я делаю это так, чтобы получать и преобразовывать данные в службе, как в старые времена.

Эффекты реагируют на действие и выполняют вызов через службу, чтобы вернуть данные и отправить другие действия на основе полученных ответов.

Это значительно упрощает тестирование, поскольку служба отделена от эффекта, основной целью которого является реакция на определенное действие, а не упаковка данных.

Для этого можно использовать Reducer, но опять же, вы должны содержать его в чистоте для удобства чтения.

person Julian    schedule 15.03.2017

Мои мнения:

  1. Данные, полученные из серверной части, останутся в хранилище без изменений.

  2. Использование селекторов в качестве вашей бизнес-логики (объединение, преобразование и т. д.) для тупых компонентов.

  3. Возможно, единственным преобразованием является использование normalizr для выравнивания данных.

person Liang Lyon    schedule 04.08.2017