Я работаю над проектом уже около 10 месяцев, который основан на Angular 4+ и Redux (через angular-redux/store). Этот проект был в основном успешным, он запущен в производство с января и не испытывает каких-либо серьезных проблем.
Но... Я постепенно разочаровывался в Redux по одной проблеме, которую я считаю по крайней мере раздражающей, но потенциально плохой для обслуживания: начальное состояние со значениями null
, поэтому я хотел бы выяснить, что я я делаю неправильно - или если это проблема дизайна Redux как такового.
Как это воспроизвести
Вот простой и хороший пример этого: https://github.com/marinho/example-app< /а>
Вы просто клонируете, npm install
его, затем запускаете npm run ng serve
и загружаете localhost:4200 в браузере. Затем перейдите в Консоль и отфильтруйте по 111, чтобы увидеть две строки:
11111 undefined
11112 null
Это напечатано двумя наблюдаемыми подписками, которые соответственно отслеживают значения на myUndefined
и myObjects.country
. Первый является недопустимым ключом (не был инициализирован в глобальном состоянии), второй был инициализирован с помощью null
.
Более точное расположение этих подписок находится здесь: https://github.com/marinho/example-app/blob/master/src/app/component.ts#L15
Почему так происходит
Как мы знаем, в Redux нужно configureStore
с начальным состоянием. Такое начальное состояние представляет собой большое дерево со всеми возможными ключами, инициализированными их редьюсерами. К моменту инициализации никаких действий не выполнялось, ни у одного из редукторов не было никакой полезной нагрузки для разрешения, поэтому в большинстве случаев по умолчанию используется null
.
До сих пор стандартный Redux/Angular, насколько мне известно.
Теперь две мои подписки (myUndefined$
и myObjects$
) наблюдают за экземплярами AnonymousSubject
, которые являются каналом, предоставляемым angular-redux/store для выдачи новых значений, обновленных на ключевом пути (т. е. @select(['myObjects', 'city'])
означает <AppState>.myObjects.city
).
Проблема в том, что при инициализации начального состояния появляются новые значения для всех известных ключей состояния, но почти всем им назначается null
.
Решение или взлом?
Когда есть подписки, прослушивающие любой из этих ключей, такое null
будет выдано в качестве первого значения, из-за чего мне нужны нулевые проверки, такие как .filter(x => x !== null)
или подобные, во многих местах. Это действительно некрасиво.
Альтернативой является использование Epics (из redux-observables), но они должны быть хорошо спроектированы, а результат пахнет смесью хрупкости с не очень надежным стеком.
У меня сложилось впечатление, что это проблема не только самого angular-redux/store, но и побочный эффект наличия глобального состояния.
Простое решение может состоять в том, чтобы исправить angular-redux/store, чтобы он начинал выдавать значения только после того, как ключ больше не undefined
, поэтому избегайте инициализации ключей с помощью null
и просто предпочитайте не инициализировать их вообще. Но опять же, если это проблема Redux, я не уверен, что это правильный путь.
Итак, кто-нибудь испытывает то же самое или имеет элегантное решение для этого?