Нарушает ли ReplaySubject.next(value) принцип неизменности состояния хранилища с избыточностью?

У меня есть приложение Angular2, которое извлекает данные из источника, требующего аутентификации, поэтому событие инициализации компонента приложения инициирует получение токена аутентификации следующим образом:

import { Component, OnInit } from '@angular/core';
import { NgRedux } from '@angular-redux/store';
import { rootReducer } from './app.reducer';
import * as createLogger from 'redux-logger';
import { AppActions } from './app.actions';
import { createEpicMiddleware, combineEpics } from 'redux-observable';
import { UserEpics } from './users/user.epics';
import { ReplaySubject } from 'rxjs/ReplaySubject';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  constructor(
    private ngRedux: NgRedux<any>,
    private actions: AppActions,
    private userEpics: UserEpics,
  ) {
    ngRedux.configureStore(
      rootReducer,
      { user: { auth: { token$: new ReplaySubject(1) } } },
      [
        createLogger(),
        createEpicMiddleware(combineEpics(...userEpics.epics)),
      ]);
  }
  ngOnInit() {
    this.ngRedux.dispatch(this.actions.getAuthToken());
  }
}

Redux хранит ReplaySubject Rxjs5, и этому субъекту будет передано значение токена из редуктора следующим образом:

case AppActions.GET_AUTH_TOKEN_DONE:
  user.auth.token$.next(action.token);
  return Object.assign({}, user, {
    auth: {
      isFetching: false,
      token$: user.auth.token$,
      reason: undefined
    }
 });

Этот код у меня работает, но нарушает ли он принцип неизменности состояния хранилища избыточности?


person Shane Voisard    schedule 09.02.2017    source источник


Ответы (1)


Я бы сказал, что да, так как вы можете изменить состояние откуда угодно, вызвав .next(...) - если бы это было Observable вместо Subject, это могло бы быть немного по-другому - но в любом случае я лично считаю, что было бы плохой практикой сохранить Observables как часть состояния.

person olsn    schedule 09.02.2017
comment
Действительно, это очень обескураживает. Все в вашем магазине должно быть сериализуемым, даже если вы на самом деле никогда не сериализуете его. Вам не нужно быть религиозным в отношении этого — если оно случайно содержит что-то, что никогда не используется — но полагаться на него — дурной тон. Все это говорит о том, что если нет простого и ясного пути к праведности, отправляйте его, но не делайте из этого привычку. По крайней мере, это мое мнение. Чтобы предоставить вам более чистое решение, мне нужно понять, почему вы считаете, что вам нужен Субъект позади. например ваш эпический код. Кажется, вы могли бы просто установить токен в магазине как есть без темы? - person jayphelps; 09.02.2017
comment
@jayphelps Спасибо, я так и подозревал. Я сделал это временно, чтобы удовлетворить компонент, который зависит от токена аутентификации, чтобы получить данные просмотра. Я преобразовал это в схему, в которой маршрут компонента защищен подпиской на токен авторизации магазина, используя @angular-redux/store - person Shane Voisard; 13.02.2017