Мы начинаем использовать Clojuescript/Reagent для нашей следующей фазы разработки нашего продукта. В основном нам нужен способ, чтобы сделать одну операцию на атоме, и мы придумали метод, как: (DEF приложения-состояние (г/атом {}))Ошибки обработки Clojurescript/Reagent
(defn select [index]
(swap! app-state
#(-> %
(assoc-in [:storyboard :pages 0 :layers 0 :children 0 :is_selected] true)
(assoc-in (GET ....)) ;; ajax call
(assoc-in [:selected :selected_tab] "tab_properties")
(assoc-in [:selected :page_object_cursor] [0])
)))
В основном своп получает функцию где задействованы все необходимые операции. Это великолепно. Тем не менее, я рассматриваю способы обработки ошибок. Я хотел бы иметь отдельный атом ошибок:
(def errors (r/atom []))
и при возникновении ошибки, чтобы захватить его и добавить его к ошибкам, без приложения состояние поменялось местами (приложение остается в последнем стабильном состоянии). Поэтому мы используем бросок из цепи и попробовать cactch
(defn change-title [title]
(try
(swap! app-state
#(-> %
(assoc :text title)
((fn [state]
(throw "there is an error")))
))
(catch js/Object e
(swap! errors conj e))))
Так что я бы ожидать, что ошибка будет пойман, и @errors иметь. Но реальность такова:
* Uncaught есть ошибка
weather_app $ ядро $ change_title @ core.cljs отн = 1450266738018: 59 (анонимная функция) @ core.cljs отн = 1450266738018: 108executeDispatch @ react-with-addons.inc.js: 3311SimpleEventPlugin.executeDispatch @ react-with-addons.inc.js: 17428forEachEventDispatch @ react-with-addons.inc.js: 3299executeDispatchesInOrder @ react-with-addons.inc.js: 3320executeDispatchesAndRelease @ react-with-addons.inc.js: 2693forEachAccumulated @ react-with-addons.inc.js: 19430EventPluginHub.processEventQueue @ react-with-addons.inc.js: 2900runEventQueueInBatch @ react-with-addons.inc.js: 11217ReactEventEmitterMixin .handleTopLevel @ response-with-addons.inc.js: 11243handleTopLevel Impl @ react-with-addons.inc.js: 11329Mixin.perform @ react-with-addons.inc.js: 18402ReactDefaultBatchingStrategy.batchedUpdates @ react-with-addons.inc.js: 9669batchedUpdates @ react-with-addons.inc. JS: 16633ReactEventListener.dispatchEvent @ реагировать-с-addons.inc.js: 11423 *
Меня действительно волнует, что я вижу такую архитектуру, которая находится под крышей. Вы справитесь с этим в небольших масштабах, но по мере увеличения вашего приложения это станет проблематичным. Вы собираетесь повредить себе. Используйте что-то вроде re-frame (предупреждение: я автор) или придумайте свой собственный вариант. –
Майк, я уже посмотрел на повторный кадр, и нам это нравится (также документация для реагента и повторного кадра), но я не думаю, что это необходимо для нас сейчас. Мы развиваемся в одном неизменном состоянии приложения в javascript уже более года, довольно большое приложение, и у нас не было проблем, и мои ребята довольно привыкли к такому способу работы. Приложение имеет в основном только 2 атома - приложение-состояние и историю. –