Отправка после окончания последней цепи отправки
Как должен выглядеть порядок отправки:
;; Initial Data
(dispatch [:http/get-bar])
;; We click something to update foo
(dispatch [:http/update-foo])
;; :success handler gets run:
(dispatch [:http-success/update-foo])
;; Foo data influences bar data, we want to get-bar again after foo updates
(dispatch [:http/get-bar])
Если у нас есть что-то вроде этого:
{:on-click
(fn []
(dispatch [:http/update-foo])
(dispatch [:http/get-bar]))}
Заказ действительно будет выглядеть так:
[[:http/get-bar]
[:http/update-foo]
[:http/get-bar]
[:http-success/update-foo]]
Мы не можем гарантировать успешное обновление до того, как снова получим планку. Возможна отправка :http/get-bar
как часть :http-success/update-foo
, но жесткое кодирование делает вещи менее гибкими. В моем конкретном случае использования у меня есть модальный компонент, который используется на двух разных страницах. При нажатии сохранить оба отправят [:http/update-foo]
но одна страница будет следовать с[:http/get-bar]
а другой свяжется с [:http/get-baz]
оба из которых нужны foo
закончить обновление первым.
1 ответ
Для меня это звучит как то, что вы можете решить с помощью https://github.com/Day8/re-frame-async-flow-fx.
Ваш код может выглядеть примерно так:
(defn modal-flow [dispatch-after]
{:first-dispatch [:http/update-foo]
:rules [
{:when :seen? :events :http/update-foo-success :dispatch [dispatch-after]}
]})
(re-frame/reg-event-fx
:modal-1
(fn [_ _]
{:async (modal-flow :get/update-foo)}))
(re-frame/reg-event-fx
:modal-2
(fn [_ _]
{:async (modal-flow :get/update-baz)}))
Асинхронные потоки действительно эффективны для создания таких зависимостей, позволяя вам освободить ваши индивидуальные обработчики от жестко заданных (или неуклюже параметризованных) значений отправки после.