2015-12-16 5 views
1

Мы начинаем использовать 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 *

+0

Меня действительно волнует, что я вижу такую ​​архитектуру, которая находится под крышей. Вы справитесь с этим в небольших масштабах, но по мере увеличения вашего приложения это станет проблематичным. Вы собираетесь повредить себе. Используйте что-то вроде re-frame (предупреждение: я автор) или придумайте свой собственный вариант. –

+0

Майк, я уже посмотрел на повторный кадр, и нам это нравится (также документация для реагента и повторного кадра), но я не думаю, что это необходимо для нас сейчас. Мы развиваемся в одном неизменном состоянии приложения в javascript уже более года, довольно большое приложение, и у нас не было проблем, и мои ребята довольно привыкли к такому способу работы. Приложение имеет в основном только 2 атома - приложение-состояние и историю. –

ответ

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

, потому что строка выброшен не является объектом, но строка!

Смежные вопросы