Не уверен, что мое решение особенно идиоматично, но я использовал что-то вроде следующего в одном из своих проектов. Считайте, что это работает для меня.
Создайте карту для запроса ajax со специальным значением для случаев ошибки (игнорируйте функцию context-uri
):
(defn xhrio-map [method path format success-event]
{:method method
:uri (context-uri path)
:timeout 5000
:response-format format
:on-success [success-event]
:on-failure [::ajax-failure]})
Затем я использую обработчик fx для сбоя (это немного сложнее, так как он также обрабатывает индикатор загрузки):
(rf/reg-event-fx
::ajax-failure
(fn [{:keys [db]} [_ http-result]]
(if (= 403 (:status http-result))
{:db (assoc db :loading-indicator nil)
:dispatch [::logout]}
{:db (assoc db :loading-indicator nil)
:dispatch
[::error-msg (str "Error fetching from " (:uri http-result)
": " (:response http-result))]})))
События ::logout
устанавливают местоположение документа. Это также вызывает выход из системы.
(rf/reg-event-fx
::logout
(fn [coefx [ev]]
{::location "./logout"}))
Наконец, загрузка ресурсов работает так:
(defn load-with-indicator [db xhrio-data]
{:db (assoc db :loading-indicator true)
:http-xhrio xhrio-data})
(rf/reg-event-fx
::load-documentation
(fn [{:keys [db]} _]
(load-with-indicator
db
(xhrio-map :get "documentation/"
(ajax/json-response-format {:keywords? true})
::received-documentation))))
:received-documentation
обрабатывается некоторым кодом, который вызывает правильные функции отображения.
При этом используются https://github.com/Day8/re-frame-http-fx и ajax.core
На серверной части я использую что-то похожее на демонстрационный код, который я опубликовал на https://github.com/ska2342/ring-routes-demo.
Надеюсь, это поможет.
Лицензия кода в этом посте
В дополнение к стандартной лицензии сайта StackOverflow, я также публикую эти строки под лицензией Eclipse Public License либо версии 1.0, либо (по вашему выбору) любой более поздней версии.
person
Stefan Kamphausen
schedule
15.07.2018