Ошибки обработки Clojurescript/реагентов

Мы начинаем использовать Clojuescript/Reagent для следующего этапа разработки нашего продукта. По сути, нам нужен способ выполнить одну операцию над атомом, и мы придумали такой метод, как: (def app-state (r/atom {}))

(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 []))

и когда возникает ошибка, чтобы зафиксировать ее и добавить к ошибкам, не меняя состояние приложения (приложение остается в последнем стабильном состоянии). Поэтому мы используем throw из цепочки и try 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 ее получит. Но реальность такова:

*Не удалось поймать ошибку

Weather_app$core$change_title @ core.cljs?rel=1450266738018:59(анонимная функция) @ core.cljs?rel=1450266738018:108executeDispatch @ react-with-addons.inc.js:3311SimpleEventPlugin.executeDispatch @ react-with-addons. inc.js:17428forEachEventDispatch @ react-with-addons.inc.js:3299executeDispatchesInOrder @ response-with-addons.inc.js:3320executeDispatchesAndRelease @ react-with-addons.inc.js:2693forEachAccumulated @ react-with-addons.inc. js:19430EventPluginHub.processEventQueue @ реакция-с-аддонами.inc.js:2900runEventQueueInBatch @ реакция-с-аддонами.inc.js:11217ReactEventEmitterMixin.handleTopLevel @ реакция-с-аддонами.inc.js:11243handleTopLevelImpl @ реакция-с-аддонами. inc.js:11329Mixin.perform @ response-with-addons.inc.js:18402ReactDefaultBatchingStrategy.batchedUpdates @ response-with-addons.inc.js:9669batchedUpdates @ react-with-addons.inc.js:16633ReactEventListener.dispatchEvent @ react- с-addons.inc.js:11423*


person Dan Bunea    schedule 16.12.2015    source источник
comment
Меня действительно беспокоит такая повсеместная архитектура ратомов. Вам это сойдет с рук в небольшом масштабе, но по мере того, как ваше приложение станет больше, это станет проблематичным. Вы навредите себе. Используйте что-то вроде рефрейминга (внимание: я автор) или придумайте свой собственный вариант.   -  person Mike Thompson    schedule 18.12.2015
comment
Майк, я уже ознакомился с рефреймингом, и он нам нравится (также документация по реагенту и рефреймингу), но я не думаю, что сейчас он нам нужен. Мы разрабатывали одно неизменяемое состояние приложения в javascript больше года, довольно большое приложение, и у нас не было проблем, и мои ребята довольно привыкли к такому способу работы. Приложение имеет в основном только 2 атома — состояние приложения и историю.   -  person Dan Bunea    schedule 19.12.2015


Ответы (1)


(catch :default e
  (swap! errors conj e))))

потому что брошенная строка - это не объект, а строка!

person Dan Bunea    schedule 16.12.2015